{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p align=\"center\">\n",
    "    <img src=\"https://github.com/GeostatsGuy/GeostatsPy/blob/master/TCG_color_logo.png?raw=true\" width=\"220\" height=\"240\" />\n",
    "\n",
    "</p>\n",
    "\n",
    "## Subsurface Data Analytics \n",
    "\n",
    "### Isotonic Regression for Subsurface Data Analytics in Python \n",
    "\n",
    "\n",
    "#### Michael Pyrcz, Associate Professor, University of Texas at Austin \n",
    "\n",
    "##### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "### PGE 383 Exercise: Isotonic Regression for Subsurface Modeling in Python \n",
    "\n",
    "Here's a simple workflow, demonstration of isotonic regression for subsurface modeling workflows. This should help you get started with building subsurface models with data analytics and machine learning. Here's some basic details about isotonic regression. \n",
    "\n",
    "#### Isotonic Regression\n",
    "\n",
    "Isotonic regression for prediction.  Here are some key aspects of linear regression:\n",
    "\n",
    "**Stepwise Linear Parametric Model**\n",
    "\n",
    "* the fit model is a piece-wise linear model at specific predictor feature isotonic constraints / thresholds under the constraint that $x_1 \\ge ... \\ge x_k$ where the resulting model must be monotonically increasing, $\\hat{f}(x_1) \\ge ... \\ge \\hat{f}(x_k)$.\n",
    "\n",
    "* the loss function is: \n",
    "\n",
    "\\begin{equation}\n",
    "min \\sum_{i=1}^{n} w_i (y_i - \\hat{f}(x)_i)^2\n",
    "\\end{equation}\n",
    "\n",
    "Subject to the constraint that:\n",
    "\n",
    "\\begin{equation}\n",
    "\\hat{f}(x_1) \\ge ... \\ge \\hat{f}(x_n)\n",
    "\\end{equation}\n",
    "\n",
    "**Assumptions**\n",
    "* **Model Parameters** - parameterized by response at each isotonic constraint / threshold\n",
    "* **Monotonic Increasing** - may not have a negative slope \n",
    "* **Piece-wise Linear Model** - assumes linear interpolation between each point\n",
    "\n",
    "#### Workflow Goals\n",
    "\n",
    "Learn the basics of isotonic regression in Python for analysis, modeling and prediction of porosity from density. This includes:\n",
    "\n",
    "* Basic Python workflows and data preparation\n",
    "\n",
    "* Training / fitting a ridge regression model\n",
    "\n",
    "* Checking the model and learning about the impact of hyperparameters\n",
    "\n",
    "#### Objective \n",
    "\n",
    "Content to support the PGE 383: Subsurface Machine Learning class.  \n",
    "\n",
    "#### Getting Started\n",
    "\n",
    "Here's the steps to get setup in Python with the GeostatsPy package:\n",
    "\n",
    "1. Install Anaconda 3 on your machine (https://www.anaconda.com/download/). \n",
    "2. From Anaconda Navigator (within Anaconda3 group), go to the environment tab, click on base (root) green arrow and open a terminal. \n",
    "3. In the terminal type: pip install geostatspy. \n",
    "4. Open Jupyter and in the top block get started by copy and pasting the code block below from this Jupyter Notebook to start using the geostatspy functionality. \n",
    "\n",
    "There are examples below with these functions. You can go here to see a list of the available functions, https://git.io/fh4eX, other example workflows and source code. \n",
    "\n",
    "#### Import Required Packages\n",
    "\n",
    "Let's import the GeostatsPy package."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os                                                   # to set current working directory \n",
    "import numpy as np                                          # arrays and matrix math\n",
    "import scipy.stats as st                                    # statistical methods\n",
    "import pandas as pd                                         # DataFrames\n",
    "import matplotlib.pyplot as plt                             # for plotting\n",
    "from sklearn.isotonic import IsotonicRegression\n",
    "from sklearn.model_selection import train_test_split        # train and test split\n",
    "from sklearn.metrics import explained_variance_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you get a package import error, you may have to first install some of these packages. This can usually be accomplished by opening up a command window on Windows and then typing 'python -m pip install [package-name]'. More assistance is available with the respective package docs.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Set the working directory\n",
    "\n",
    "I always like to do this so I don't lose files and to simplify subsequent read and writes (avoid including the full address each time).  Also, in this case make sure to place the required (see below) data file in this working directory.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.chdir(\"c:/PGE383\")                                       # set the working directory"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Loading Data\n",
    "\n",
    "Let's load the provided dataset. 'GrainSize_por.csv' is available at https://github.com/GeostatsGuy/GeoDataSets. It is a comma delimited file with 20 grain size ($mm$) and porosity (as a percentage) measures from the subsurface. We load the data file with the pandas 'read_csv' function into a data frame we called 'df'.  We preview each with the head function from Pandas DataFrames."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Grainsize</th>\n",
       "      <th>Porosity</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2.689284</td>\n",
       "      <td>5.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.683638</td>\n",
       "      <td>10.647582</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>9.877106</td>\n",
       "      <td>7.926271</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>12.239344</td>\n",
       "      <td>11.278953</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>27.623312</td>\n",
       "      <td>10.508753</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>27.941670</td>\n",
       "      <td>14.960621</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>28.096457</td>\n",
       "      <td>10.619494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>29.962596</td>\n",
       "      <td>11.896658</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>30.602685</td>\n",
       "      <td>12.479068</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>31.788502</td>\n",
       "      <td>16.865819</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>35.977007</td>\n",
       "      <td>16.611485</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>42.246780</td>\n",
       "      <td>16.717406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>44.865601</td>\n",
       "      <td>15.023351</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>54.495121</td>\n",
       "      <td>15.601486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>59.434456</td>\n",
       "      <td>16.785793</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>71.215562</td>\n",
       "      <td>17.486703</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>73.862756</td>\n",
       "      <td>19.641645</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>76.989911</td>\n",
       "      <td>22.983510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>88.401523</td>\n",
       "      <td>20.464334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>97.022766</td>\n",
       "      <td>23.431172</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Grainsize   Porosity\n",
       "0    2.689284   5.400000\n",
       "1    6.683638  10.647582\n",
       "2    9.877106   7.926271\n",
       "3   12.239344  11.278953\n",
       "4   27.623312  10.508753\n",
       "5   27.941670  14.960621\n",
       "6   28.096457  10.619494\n",
       "7   29.962596  11.896658\n",
       "8   30.602685  12.479068\n",
       "9   31.788502  16.865819\n",
       "10  35.977007  16.611485\n",
       "11  42.246780  16.717406\n",
       "12  44.865601  15.023351\n",
       "13  54.495121  15.601486\n",
       "14  59.434456  16.785793\n",
       "15  71.215562  17.486703\n",
       "16  73.862756  19.641645\n",
       "17  76.989911  22.983510\n",
       "18  88.401523  20.464334\n",
       "19  97.022766  23.431172"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(\"GrainSize_Por.csv\")                    # read a .csv file in as a DataFrame\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Test and Train Split\n",
    "\n",
    "Let's separate the data into test and train and visualize it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,0], df.iloc[:,1], test_size=0.25, random_state=73073)\n",
    "plt.subplot(111)\n",
    "plt.scatter(X_train, y_train,  color='black', s = 20, alpha = 0.5, label='train')\n",
    "plt.scatter(X_test, y_test,  color='blue', s = 20, alpha = 0.5, label='test')\n",
    "plt.title('Porosity from Grainsize with Training Data'); plt.xlabel('Grain Size (mm)'); plt.ylabel('Porosity (%)')\n",
    "plt.xlim(0,100)#; plt.ylim(0,1500000)\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.0, wspace=0.2, hspace=0.2)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The data is generally monotonic increasing with noise. The training and testing split looks reasonable.\n",
    "\n",
    "Let's assign the isotonic constraints / thresholds and visualize them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_predict = np.linspace(5,95,10)\n",
    "plt.subplot(111)\n",
    "plt.scatter(X_train, y_train,  color='black', s = 20, alpha = 0.5, label='train')\n",
    "plt.scatter(X_test, y_test,  color='blue', s = 20, alpha = 0.5, label='test')\n",
    "for threshold in X_predict:\n",
    "    plt.axvline(threshold, color='red', alpha = 0.3)\n",
    "plt.title('Porosity from Grainsize'); plt.xlabel('Grain Size (mm)'); plt.ylabel('Porosity (%)')\n",
    "plt.xlim(0,100)#; plt.ylim(0,1500000)\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.0, wspace=0.2, hspace=0.2)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Fit the Model\n",
    "\n",
    "Let's fit the model with these isotonic constraints / thresholds."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "iso_reg = IsotonicRegression().fit(X_train, y_train)\n",
    "y_predict = iso_reg.predict(X_predict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can visualize the model parameters, the $f(x_1),...,f(x_k)$ estimates at the thresholds."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 7.64856974, 10.8938532 , 10.8938532 , 14.1199068 , 15.78074761,\n",
       "       15.88347922, 17.88740369, 20.85697181, 23.1625063 , 23.38597028])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_predict"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can visualize the model with a regular line plot over the model parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot model fit\n",
    "plt.subplot(111)\n",
    "plt.scatter(X_train, y_train,  color='black', s = 20, alpha = 0.5, label='train')\n",
    "plt.scatter(X_test, y_test,  color='blue', s = 20, alpha = 0.5, label='test')\n",
    "plt.plot(X_predict,y_predict, color='red', linewidth=1, label='model')\n",
    "for threshold in X_predict:\n",
    "    plt.axvline(threshold, color='red', alpha = 0.2)\n",
    "plt.title('Isotonic Regression Porosity from Grainsize with Training Data'); plt.xlabel('Grain Size (mm)'); plt.ylabel('Porosity (%)')\n",
    "plt.xlim(0,100)#; plt.ylim(0,1500000)\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.0, wspace=0.2, hspace=0.2)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Make Predictions and Check the Model Goodness\n",
    "\n",
    "Now let's make predictions at the testing data locations and check the model goodness\n",
    "\n",
    "* let's use the variance explained\n",
    "\n",
    "We will plot the estimates for the training data as 'predicted test'\n",
    "\n",
    "* note the iso_reg.transform() function does not seem to work properly\n",
    "\n",
    "* we will just use a linear interpolation function from numpy to make estimates of the response feature with the model at new predictor feature values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Variance Explained = 0.337\n"
     ]
    },
    {
     "data": {
      "image/png": "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oWvXrvz973/n/vvvZ+HChfTr149+/foBMHLkSHr16sUvfvELTj31VBKJBABvvPEGe+21F3369OGFF17Y5HWsXr2am266iREjRtCtWzdGjBhBMpnk3HPPpUePHuy///68/PLLAHzxxRcceOCBdOvWja5duzJz5kyuueYaZs2aRbdu3bjyyiu3+byKiIhIPfLll3D66dC3L+y3Xwih11yjEFoPFBVBcfH6y3/j8fC4qCizdUnV0NQuGyn4roD88fkUlxQTaxgjt0cuOTvlbNM+p0+fziOPPELv3r0599xzyf/HP7ji0ksBaNq0KePGjQNAJ2l6AAAgAElEQVTgiCOO4MEHH2T33Xfn448/5ne/+x2jR4/mkksu4be//S1nn302eXl5ZR7joYceYvbs2UyaNIlGjRqxdOlSWrZsyb333ss777xD69atWbx4MXfccQejRo0iKyuLP/3pT9x7771cddVVXHDBBYwePZqf//znnHbaaZvsv3Hjxtx2221MmDCBBx54AIDrrruOww8/nGHDhlFUVMSBBx7IkUceyYMPPsgll1zCmWeeyerVqykpKeHuu+9mypQpTJ48eZvOpYiIiNQjX3wBt98O77wDl10G//ynBiWqZ7KzIRaDRCK89YlEeJydnenKpCqoZTRFcnWS/PH5xBvH6bB9B+KN4+SNz9vmFtIOHTrQu3dvAAYPHsy4Dz5Y91xp8EskEnzwwQeceuqpdOvWjSFDhrBo0SIA3n//fU4//XQAzjrrrDKPMWrUKC666CIaNQp/X2jZsuUm63z00Ud8+eWX9O7dm27duvHYY48xd+5cpk2bRufOndl9990xMwYPHlyp1zVy5EjuvvtuunXrRt++fVm1ahXz5s2jV69e3HnnnfzpT39i7ty5NGvWrJJnSkRERIQQQk87DQ4/HH7xi9ASevXVCqL1UFYW5OaGEDp/frjNzQ3LpfZLW8uomXUAHgd+BqwFHnL3+8ysJTAC6ATMAQa5e2EZ258D3BA9vMPdH0tXraWKVhVRXFJMvHH4oos3jlO4spCiVUVkNd76T7yZlfs4K/pNWrt2LdnZ2eW2HG68j425e6XWOeqoo3jqqac2WD558uTNblve/p5//nn23HPPDZbvvffeHHTQQbz22msMGDCAhx9+mF133XWL9y8iIiL1zJQpoSX03XfDSDWPPKIAKuTkwNChoWtudraCaF2SzpbRNcDl7r430BPINbN9gGuAt919d+Dt6PEGosB6M3AQcCBws5ntkMZaAchumk2sYYzE6nAdZWJ1gljDGNlNt60fwLx58/jwww8BeOqpp+hz8MGbrLPddtvRuXNnnn32WSAEvc8++wyA3r178/TTTwMwfPjwMo/Rv39/HnzwQdasWQPA0qVLAWjRogXLly8HoGfPnrz//vt89dVXAKxYsYIZM2aw1157MXv2bGbNmrWuxrKk7gtgwIAB/P3vf8fdAZg0aRIAX3/9Nbvuuiu///3vOeGEEygoKNhkWxEREZF1pkyBQYPgyCOhR4/QEnrllQqisk5WFrRrpyBa16QtjLr7Inf/NLq/HJgKtANOBEpbOR8DTipj8wHAW+6+NGo1fQs4Ol21lspqnEVuj1wSqxPMXzafxOoEuT1yt6lVFEJL4WOPPUbXrl1ZunQpv73wwjLXGz58OI888gj77bcf++6777oBge677z7y8vLo0aMHy5YtK3Pb888/n44dO9K1a1f2228/nnzySQAuvPBCjjnmGPr168eOO+7Io48+yumnn07Xrl3p2bMn06ZNo2nTpjz00EMce+yx9OnTh1122aXMY/Tr148vv/xy3QBGN954I8XFxXTt2pUuXbqsG1xpxIgRdOnShW7dujFt2jTOPvtsWrVqRe/evenSpYsGMBIREZHg88/h1FNDCD3wwBBCr7hCiUOknrDSVq20HsSsEzAW6ALMc/fslOcK3X2Hjda/Amjq7ndEj28EVrr7PRUdp3v37j5hwoQNlk2dOpW99957i+pNrk5StKqI7KbZ2xxE58yZw3HHHceUKVPWL1y1Ktw2bbpN+64rtuY9KtOMGeF2jz22fV+yIZ3b9NB5TQ+d1/TRuU2P+nheCwrgtttg3LjQAnrRRekJoPXx3FYHndf0qIXn1cwmunv3rd0+7QMYmVkceB74g7v/WNnNylhWZmo2swvNbIKZTfjhhx+2tswNZDXOot127bY5iIqIiIhIis8+g1/+EgYMgIMPhq+/DteGqiVUpF5Kaxg1sxghiA5399LJK78zs52j53cGvi9j0wVAh5TH7YGFZR3D3R9y9+7u3n3HHXesuuKrSKdOnTZsFRURERGpBzaYt700hB59NPTpE7rjXnYZNG+e6TJFJIPSOZquAY8AU9393pSnXgHOAe6Obl8uY/M3gTtTBi3qD1ybrlpFREREpOqUztv+s5nfcuKzn9Hl6ySxa66Df/+7SgJoMpmkqKiI7OzsdTMTiEjtk7YwCvQGzgI+N7PS+UquI4TQZ8zsPGAecCqAmXUHLnL38919qZndDoyPtrvN3ZdubSGVmfZEMqM6rlkWERGR6pNcneSVEbeRO+IzOk3/ltGndGfYZbty9wkXkNV424NoQUEB+fn5FBcXE4vFyM3NJScnpwoqF5HqlrYw6u7jKPvaT4Ajylh/AnB+yuNhwLBtraNp06YsWbKEVq1aKZDWMO7OkiVLaKqBnEREROqGSZNocOO1/O8HY/nwjEN5+aZBrGkSY8Wy+ds8bzuEFtH8/Hzi8TjxeJxEIkFeXh5Dhw5VC6lILZTOltEaoX379ixYsICqGtyoShQXh9tYLLN11ABNmzalffv2mS5DREREtsWnn8Ktt8KECTS4/A/c+Jv2NGmRTbxxrMrmbQcoKiqiuLiYeDT/aDwep7CwkKKiIoVRkVqozofRWCxG586dM13GhmrhsM0iIiIim0gJoVxzDTz9NE2aNePC7z4nb3wehSsLiTWMVcm87QDZ2dnEYjESicS6ltFYLEZ29rYHXRGpfnU+jIqIiIhIFZs4MYTQTz+Fq6+GESM2mD89Z6cchvYfWmXztpfKysoiNzeXvLw8CgsL110zqlZRkdpJYVREREREKmfChBBCJ00KLaHPPLNBCE2V1TgrLXO25+TkMHToUI2mK1IHKIyKiIiISMXGjw8hdPJkuPZaePbZckNodcjKylIIFakDGmS6ABERERGpocaPh+OOg5NPhoED4auvIDc3o0FUROoOhVERERER2dAnn8Cxx4YQeuyxIYT+7ncKoSJSpdRNV0RERESCjz8O3XGnTAndcV94AZo0yXRVIlJHKYyKiIiI1HcffRRC6BdfwHXXwYsvKoSKSNopjIqIiIjUVx9+GELo1KkhhL70kkKoiFQbXTMqIiIiUt98+CEcfTT86lfhutCZM2HIEAVREalWCqMiIiIi9cUHH8CAAXD66etD6IUXQuPGma5MROohddMVERERqevefz90x50xA66/Hs45RwFURDJOYVRERESkrnr/fbjlljA1y/XXw9lnK4SKSI2hMCoiIiJS14wbF0LorFlwww0hhMZima5KRGQDCqMiIiIidcV774XuuF9/HULoWWcphIpIjaUwKiIiIlLbjR0bQuicOaE7rkKoiNQCCqMiIiIitdXYsaE77ty5oSV08GCFUBGpNRRGRURERGqbd98NIXT+/BBCzzxTIVREah2FUREREZHaYsyYEEIXLIAbbwwhtJH+OycitZO+vURERERqutIQ+s0361tCFUJFpJbTt5iIiIhITeS+PoQuXBhaQs84QyFUROoMfZuJiIiI1CTu8M47IYR++20IoaefrhAqInWOvtVEREREagJ3GD06TNHy3XchhP7qVwqhIlJn6dtNREREJJPc4aOP4Lzz4Pvv4aabQght2DDTlYmIpJXCqIiIiEh1c4cvvoBnnoEnngjLbr9dIVRE6hWFUREREZHq8uWXIYA+8wwkEnDqqfDnP0NODuy5Z6arExGpVmkLo2Y2DDgO+N7du0TLRgCl37TZQJG7dytj2znAcqAEWOPu3dNVp4iIiEhaTZ++PoAWFoYA+sgjcNBB0KABzJiR6QpFRDIinS2jjwIPAI+XLnD300rvm9lQYFkF2/dz98Vpq05EREQkXWbOXB9Af/ghBNAHH4RevUIArQeSSSgqguxsyMrKdDUiUhOlLYy6+1gz61TWc2ZmwCDg8HQdX0RERKRazZq1PoAuWgSnnAIPPAC9e9ebAFqqoADy86G4GGIxyM0NPZFFRFJl6pvxEOA7d59ZzvMOjDSziWZ2YTXWJSIiIlJ5s2eHaz67d4eDD4b58+Gvf4VvvglB9JBD6l0QTSZDEI3HoUOHcJuXF5aLiKTK1ABGpwNPVfB8b3dfaGZtgLfMbJq7jy1rxSisXgjQsWPHqq9UREREJNXcufDss6EFdM4cOPnkEEgPPVRzghK65hYXhxAK4bawMCxXd10RSVXt35hm1gg4GTigvHXcfWF0+72ZvQgcCJQZRt39IeAhgO7du3uVFywiIiIyf/76APrVVyGA3nkn9O2rALqR7OzQNTeRCEE0kQiPs7MzXZmI1DSZ6DdyJDDN3ReU9aSZZZlZi9L7QH9gSjXWJyIiIhK62t53X7jms1u3MC/orbeG60EfegiOPFJBtAxZWeEa0UQiZPhEIjxWq6iIbCydU7s8BfQFWpvZAuBmd38E+BUbddE1s7bAw+4+ENgJeDGMcUQj4El3fyNddYqIiIiss3AhPP98aAH94gs48US44QY44gho3DjT1dUaOTkwdKhG0xWRiqVzNN3Ty1n+6zKWLQQGRve/BvZLV10iIiIiG/j22/UBtKAATjgBrrkmtHw2aZLp6mqtrCyFUBGpmPqWiIiISP3z/ffwwgshgH76KRx3HFx+OQwYoAAqIlJNFEZFRCKaoF2kjlu8eH0AnTABBg6E3/8+BNBmzTJdnYhIvaMwKiKCJmgXqc2SySRFRUVkZ2eTtfFfkpYsgRdfDAH044/hmGPgd78LtwqgIiIZpTAqIvVe6gTtpdMQ5OWFwTfUQpoeFYYHkS1QUFBAfn4+xcXFxGIxcnNzyWnfHl56CUaMgA8/hP794YILQijV501EpMZQGBWRek8TtFevMsODmqFlKySTSfLz84nH47Ru1IhOn30Gxx2HFxVhRx4Jv/kNPPfc+l9uERGpURRGRaTeq6kTtNfFa1hTw0M8HieRSJCXl8fQoUPVQipbbNm8eXSfOpVDvv2WXebOZXbnzozt3JlW//gHbffcM9PliYjIZiiMiki9VzpBe15eaBEtvWY0k9morl7DWlRURHFxMfGopSoej1NYWEhRUZHCqFTO8uXw6qvwzDPsPHo0PVq2ZOI++/DCySezpLiYRCLB4PbtM12liIhUgsKoiAg1a4L2unwNa3Z2NrFYjEQisa5lNBaLkZ3pZmip2RIJ+M9/wiBEb78NhxwCgwZhjz5Kg/nzGZuXR/H336/r9q0/bIiI1A4KoyIikZoyQXtdvoY1KyuL3Nxc8vLyKCwsVHiQ8iWT8NprIYC+9Rb07g2DBsEjj8AOO6xbLSc7m6FDh2pALBGRWkhhVESkhqmp17BWlZycHIUHKduKFfDf/4YA+sYb0LMnnHYaPPQQtGxZ7mZZWVn6HImI1EIKoyIiNUxNvIa1qik8yDorV4bg+cwzIYj26BFaQPPyoHXrTFcnIiJptNkwamZtgN5AW2AlMAWY4O5r01ybiEi9VZOuYRWpcqtWwZtvhgD62mtwwAEhgN53H7Rpk+nqRESkmpQbRs2sH3AN0BKYBHwPNAVOAnYzs+eAoe7+Y3UUKiJS39SUa1hFqsRPP4VrP595JoyGu99+IYDeey/stFOmqxMRkQyoqGV0IHCBu8/b+AkzawQcBxwFPJ+m2kRERKQ2W70aRo0KAfSVV6BLlxBA//Qn2HnnTFcnIiIZVm4YdfcrK3huDfBSWioSERGR2qu4OEy/8swz8PLLsPfeIYD+8Y/Qrl2mqxMRkRqk0gMYmVlP4E6gCXCPu7+YtqpERESk9lizBt55JwTQF1+E3XcPAfTWW6FDh0xXJyIiNVRF14z+zN2/TVl0GXACYMAHgMKoiIhIfbVmDbz7bgigL7wAu+4aAujEibDLLpmuTkREaoGKWkYfNLOJwF/cfRVQBJwBrAU0aJGIiEh9U1IC48fDX/8aAmjHjiGAfvIJdO6c6epERKSWqeia0ZPM7HjgP2b2GPAHQhhtThhRV0RERFKVlIQWw+LicJt6f0uXpXv9rdnHTz/BHnvA2WfDBx/Abrtl+oyLiEgtVuE1o+7+qpm9DvwOeAH4o7u/Vy2ViYiIbKlVq+D996GgAOLx6g+GZtCoEcRiG95WdtmWrt+oETRuDM2bb9s+KlvH11+H4+2xR6bfaRERqQMqumb0BOAqoAS4Bfg3cJOZ/Q64wd1nVUuFIiIi5XGH6dPhzTfDz7hxobWue3do2XLbQtrWhLoGDTJ9RqpMMpmkqKiI7BYtyCqd8LZx48wWJSIidUpFLaN3AL2AZsDr7n4gcJmZ7Q78EfhVNdQnIiKyoWXLYPRoeOONEEBLSmDAADj3XBg+HH74Iayn1rutVlBQQH5+PsXFxcRiMXJzc8nJycl0WSIiUsdUFEaXEQJnM+D70oXuPhMFURERqS5r18Knn4bg+cYbMHkyHHxwCKCXXBLmsTRbv35pGJWtkkwmyc/PJx6PE4/HSSQS5OXlMXToULIyXZyIiNQpFYXR/wFOB4oJAxeJiIhUj2+/hZEjQwB96y1o1QqOPhquvx4OPTR0v5W0KCoqori4mHg8DkA8HqewsJCioiKFURERqVIVhdFV7v73ijY2s7i7J6q4JhERqW9Wrw6js5a2fs6ZA4cfHgLoXXeFKUSkWmRnZxOLxUgkEutaRmOxGNnZ2ZBMZro8ERGpQyoKoy+b2WTgZWCiuycBzGxXoB8wCPgn8FzaqxQRkbpn1qz1Aw+NGQN77hm63j7wABx0UBgQSKpdVlYWubm55OXlUVhYuO6a0XWDGImIiFSRiuYZPcLMBgJDgN5mtgOwBpgOvAac4+7fVk+ZIiJS6yUS8M476wNoIhHC569+BY88Aq1bZ7pCieTk5DB06NAwmm52toKoiIikxebmGX0deL2aahERkbrEPcz3Wdr1dvx46NEjdL197jno2nXDgYekRsnKylIIFRGRtEpbHygzGwYcB3zv7l2iZbcAFwClQx1eFwXejbc9GrgPaAg87O53p6tOERGpQosXhwGHSls/4/HQ+nnZZdC3b3icRslkksR339GiRQs0xJGIiEjNls4Lch4FHgAe32j5X939nvI2MrOGQB5wFLAAGG9mr7j7l+kqVEQyL5lMqktgbbRmDXz88fo5P6dPD6FzwAC48UbYbbdqK6V0bsyWixfTqFEjTr3+es2NKSIiUoOlLYy6+1gz67QVmx4IfOXuXwOY2dPAiYDCqEgdVRoiiouL1w2WohBRg82bt77r7ejR0KlT6Hr75z+H+T8bN672klLnxtw5FiOZTK6fG1N/3BAREamRGmxuBTO7x8z2rcJj/q+ZFZjZsGhQpI21A+anPF4QLSuvvgvNbIKZTfhBE52L1DqpIaJDhw7E43Hy8vJIagqJmmPlyhA8L70U9t4buncPo9+edBJMnQqTJoXpV/r2zUgQhU3nxszKyqK4uJiioqKM1CMiIiKbt9kwCkwDHjKzj83sIjPbfhuO93/AbkA3YBEwtIx1yhrNwsvbobs/5O7d3b37jjvuuA2liUgmbBwi4vG4QkSmucOXX8K994butm3awJ13htFun3gCvv0Whg+Hs86Cn/0s09UCG86NCeGPHOvmxhQREZEaabNh1N0fdvfewNlAJ6DAzJ40s35bejB3/87dS9x9LWGO0gPLWG0B0CHlcXtg4ZYeS0Rqh41DRCKRUIjIhMLCMMLt+edDx44wcCDMmAEXXQQLFsDYsXD99XDAAdCgMn/HrF6lc2MmEgkWLVrEihUrNDemiIhIDVepa0ajQYX2in4WA58Bl5nZEHf/VWUPZmY7u/ui6OH/AFPKWG08sLuZdQa+AX4FnFHZY4hI7VIaIvLy8igsLFx3zahCRJqVlMCECetHvf38c+jTJ7SEXnkl7LFHrZt2pXRuzMSnn4bRdHXdsYiISI222TBqZvcCxwOjgTvd/ZPoqT+Z2fQKtnsK6Au0NrMFwM1AXzPrRuh2OwcYEq3bljCFy0B3X2Nm/wu8SZjaZZi7f7GVr09EaoHSEKHRdNNs4UIYOTJc/zlqFOy8cwift9wChxwCTZtmusJtlpWVRdZOO2W6DBEREamEyrSMTgFucPcVZTxXVjdbANz99DIWP1LOuguBgSmPXwc2mX9UROqurKwshdCq9tNPMG7c+pFvv/kGjjwyBNB77oH27TNdoYiIiNRjlQmjZ7r7sNQFZva2ux/h7svSVJeIiGwpd5g5c33X27FjYd99Q/h86CHo0QMaNsx0lSIiIiJABWHUzJoCzQndbHdg/Si32wFtq6E2ERHZnOXLw1yfb7wRAujq1SF8nn02PP44tGyZ6QpFREREylRRy+gQ4A+E4PlpyvIfgbx0FiUiIpBcnaRoVRHZTbPJahx1YV67FiZPXt/19tNPoVevEEBzc0NLaC0beEhERETqp3LDqLvfB9xnZhe7+9+rsSYRkXqv4LsC8sfnU1xSTMvla/j9sr3o8NGXYQCiHXYI4fOaa+Cww6B580yXKyIiIrLFKuqme7i7jwa+MbOTN37e3V9Ia2UiIvVUMlnEyH/dwKmTv2PvT+ezw8KlTOu6M23OvJQmt98OnTplukQRERGRbVZRN93DCNO5HF/Gcw4ojIqIVJXZs9d1vW025h1+uWNj5vfcmzf+dwAL9mnP3ORCbuv3S9pt1y7TlYqIiIhUiYq66d4c3f6m+soREalHPvsMXnkFPvkEli2D/v1h0CBW5v2NP026m3jjOPHGcRKrE8Qaxshump3pikVERESqTIPNrWBml5jZdhY8bGafmln/6ihORKROmj4dfvlLuPhiaNMGRoyAhQvD6LdnnEFWu07k9sglsTrB/GXzSaxOkNsjd/0gRiIiIiJ1QGXmGT3X3e8zswFAG+A3wL+AkWmtTESkrlm0CG69FZ5/Hq68Em6+GZo2hT322GTVnJ1yGNp/6Kaj6YqIiIjUEZttGWX9/KIDgX+5+2cpy0REZHN+/BFuvBG6dIEWLULL6FVXhSBagazGWbTbrp2CqIiIiNRJlQmjE81sJCGMvmlmLYC16S1LRKQOWL0a7r8/tHzOmxfmBP3LX6Bly0xXJiIiIpJxlemmex7QDfja3VeYWStCV10RESnL2rXwzDNw/fWw555hbtCuXTNdlYiIiEiNstkw6u5rzaw9cIaZAbzr7q+mvTIRkdro7bfh6qvBDB5+GPr1y3RFIiIiIjXSZsOomd0N9ACGR4t+b2YHu/u1aa1MRKQ2mTw5hNBZs+DOO+HUU0MgFREREZEyVeaa0YHAUe4+zN2HAUcDx6a3LBGRWmLOHDjrLDj6aDjhBPjySxg0SEFUREREZDMqE0YBUmda3z4dhYiI1CpLlsBll8EBB8Cuu8LMmZCbC40bZ7oyERERkVqhMgMY3QVMMrN3CFO6HAqoi66I1E8rVsB998HQoaEF9Isv4Gc/y3RVIiIiIrVOhWHUwohF44CehOtGDbja3b+thtpERGqONWvg0UfhllugVy/44IMwZYuIiIiIbJUKw6i7u5m95O4HAK9UU00iIjWHO7z6Klx7LbRuDc8/DwcdlOmqRERERGq9ynTT/cjMerj7+LRXIyKSQcnVSYpWFZHdNJusxlmh9fPqq6GoCP78Zxg4UAMTiYiIiFSRyoTRfsAQM5sLJAlddd3dNYO7iNQZBd8VkD8+n+KSYtovTHDZq4vZfspMuO22MFpuw4aZLlFERESkTqlMGD0m7VWIiGRQcnWS/PH57Lwcjn1yMnu9N5U3T+7K0U99Stb2rTNdnoiIiEidtNkw6u5zzWw/4JBo0Xvu/ll6yxIRqT7Lvp/PcY9/xOFvzmDSMd3Ie/xiZvhietpPZGW6OBEREZE6arPzjJrZJcBwoE3084SZXZzuwkRE0u6nn+C++9j5gENptWQl9+YN5q2L+vND0xJiDWNkN83e/D5EREREZKtUppvuecBB7p4EMLM/AR8Cf09nYSIiabN2LTz9NNxwA+y9N/bWKOI7GQvG51G8bD6xhjFye+SGQYxEREREJC0qE0YNKEl5XBItExGpfUaNCiPkNmwIw4ZB374A5ABD+w/dcDRdEREREUmbyoTRfwEfm9mL0eOTgEfSV5KISBpMmgTXXANffw133gmnnLLJNC1ZjbMUQkVERESqyWavGXX3e4HfAEuBQuA37v63zW1nZsPM7Hszm5Ky7C9mNs3MCszsRTMr84IsM5tjZp+b2WQzm1D5lyMispHZs2Hw4DBH6Iknwpdfwqmnar5QERERkQwrN4yaWVMz+4OZPQD0APLd/T53n1TJfT8KHL3RsreALtEcpTOAayvYvp+7d3P37pU8nojIeosXw6WXQvfurO7YkYVjxpA85xyIxTJdmYiIiIhQccvoY0B34HPCXKP3bMmO3X0soTU1ddlId18TPfwIaL8l+xQR2awVK0I33L32gtWr+fK55/j90qXc+Oc/c/nll/P5559nukIRERERoeIwuo+7D3b3fwCnAIdW8bHPBf5bznMOjDSziWZ2YRUfV0TqojVr4OGHYY89YPJk+PBDkn/+M/ePGEE8HqdDhw7E43Hy8vJIJpOZrlZERESk3qtoAKPi0jvuvsaq8PoqM7seWEOYv7Qsvd19oZn9f3v3HiVXWeZ7/PsMqYBWocVdhARlDRfRBsGAemQQQREYDqDiAQ4qR1F0pjzKUYfbOKAgomJER9MwDILoQrwgN12K3JfIeCFy6YRLALnYdLiTAqoE0pDn/LErTtN0Qgjdtbs6389avar2rr13PUn22skv77ufvT5waUTc2hlpHetYhwKHAsycOXPcapTUIzLhoovgqKNg/fXhvPNghx0AaA4NMTw8TK1WA6BWq7Fo0SKazSbVqo2KJEmSyrS8MLpNRDzeeR/AyzrLAWRmvmJlvjAiDgb2AnbNzBxrm8xc2Hl9sNPFdwdgzDCamacBpwHMmjVrzONJmqKuuaZ4TMtjj8HXvw577PGcxkT1ep1KpUKr1aJWq9FqtahUKtTrY/ZOkyRJUhctc5puZq6Wma/o/KyZmdNGvF/ZILo7cASwd2b+dRnbVCNizaXvgUOJCQIAABhtSURBVN2A+WNtK2kVdcstsO++cOCB8LGPFdNy99zz+Y9qqVZpNBq0Wi0GBwdptVo0Gg1HRSVJkiaBFXnO6EqJiHOAnYF1I+Je4FiK7rmrU0y9Bfh9Zn4iIl4NnJ6ZewIbAOd3Pp8G/DAzL56oOiX1kIUL4QtfgPPPh8MPh3POgZe9bLm79PX1MXv2bJrNJvV63SAqSZI0SUxYGM3MA8dY/d1lbLsQ2LPz/k5gm4mqS1IPeuwx+NrX4NRT4ZBD4LbbYK21Vnj3arVqCJUkSZpkltdNV5K6qr24zdDjQ7QXd7rdPv00fPObRYfchQuL6bhf+9oyg2i73WZoaMhuuZIkST1gwkZGJenFGHhggP5r+xl+dpjpMY2jhl7LzJNOg9e9Di67DPr6lr//wAD9/f0MDw9TqVRoNBr0vcA+kiRJKo9hVFLp2ovb9F/bT216ja0HHmCX//gFw38HT/7H93jZu/Z44f3bbfr7+6nVan/rmjtnzhxmz57t9FxJkqRJyjAqqXTNp5pseNt9fOCc+dTvb3L5R3fl19vUOO7NW7PRiuzfbPo8UUmSpB5jGJVUrrvuYoOjj+SwX1/GZQe9lZv2eSuPL3mSyuIW9TVW7HmgPk9UkiSp99jASFI5Hn4YDjsMZs1i2pZbce/cK7j03X/PPe2FtBa3aGzfoDp9xUY1fZ6oJElS73FkVFJ3tdtFh9yTT4YDDoCbb4YNNuD1wOyN30DzqSb1NeorHESX8nmikiRJvcUwKqk7nnkGzjwTvvAF2HFH+N3vYLPNnrNJdXr1RYfQ5+zv80QlSZJ6hmFU0sTKhAsvhKOOgle9Ci64ALbfvuyqJEmSVDLDqLqm3W47hXJVc801cPjh8MQT8I1vwO67Q0TZVUmSJGkSMIyqKwYGBujv72d4eJhKpUKj0aCvr6/ssjRRbrmlGAm9/no4/ng46CBYbbWyq5IkSdIkYjddTbh2u01/fz+1Wo0ZM2ZQq9WYM2cO7Xa77NI03oaG4GMfg512Ku4LXbAAPvQhg6gkSZKexzCqCddsNhkeHqZWqwFQq9UYHh6m2WyWXJnGzWOPwdFHw9Zbw9prw223wec+B2usUXZlkiRJmqQMo5pw9XqdSqVCq9UCoNVqUalUqNfrJVeml+zpp4tHtGy2Gdx/P9xwA3z1q7DWWmVXJkmSpEnOMKoJV61WaTQatFotBgcHabVaNBoNmxj1siVL4OyzYcst4Yorip8zzoAZM8quTJIkST3CBkbqir6+PmbPnm033angkkvgiCNg9dXhe9+Dt7+97IokSZLUgwyj6ppqtWoI7WXz50OjAffcAyeeCO99r49pkSRJ0kozjGpqyCxG7K68El75yrKrmXruvBNuugmOOw4++lGoVMquSJIkST3OMNpD2u2201zHcs018C//AosWwf77w8yZZVc09Wy1VdGoaNtty65EkiRJU4RhtEcMDAzQ39/P8PAwlUqFRqNBX19f2WWV69Zb4cgj4frr4YQTYNYs+Lu/g803L7uyqee227ryNe02NJtQr4P/3yJJkjS12U23B7Tbbfr7+6nVasyYMYNarcacOXNot9tll1aO++6Dj38cdtoJdtwRFiyAD3ygCKLqKe12m6GhIdrtNgMD8NnPwjHHFK/z5pVdnSRJkiaSI6M9oNlsMjw8TK1WA6BWq7Fo0SKazeaqNV33iSfgpJNgzhz4yEeKkdG11y67Kq2kkaP9UOXxx49lk03WoVaDVqv4Y5492xFSSZKkqcqhpB5Qr9epVCq0Wi0AWq0WlUqFer1ecmVdMjxcJJPNN4e774brritCqUG0Z40e7Z82bV3mzbuF6dMXA1CrFX/szWbJhUqSJGnCGEZ7QLVapdFo0Gq1GBwcpNVq0Wg0pv6oaCace27RPOfnP4eLL4bvfx822aTsyvQSjR7tX2ed1YBhHnnkaaAYGa1UintHJUmSNDU5TbdH9PX1MXv27FWnm+5vfgOHHw6LF8Mpp8A731l2RRpHI0f7a7Uaixcvoq/vap55ZkcGB4sg2mg4RVeSJGkqM4z2kGq1OvVD6M03Fx1y582DL30JDjzQxkRT0NLR/jlz5rBo0SIqlQrHHHMwm25asZuuJEnSKsIwqslh4UI49li48MIijP70p7D66mVXpQm0rNF+Q6gkSdKqYUKHnCLijIh4MCLmj1i3dkRcGhG3d17XWsa+B3e2uT0iDp7IOlWixx+Hz38e+vpgnXWK51l+5jMG0VVEtVplo402mvoj/pIkSXqeiZ7/+D1g91HrjgQuz8zNgMs7y88REWsDxwJvBnYAjl1WaFWPWrwYvv3tokPu0BDccAN85St2rJEkSZJWERMaRjPzN8Cjo1bvA5zVeX8WsO8Yu74buDQzH83MRcClPD/Uqhdlwk9+UnTI/dWv4JJL4MwzYcaMsiuTJEmS1EVl3DO6QWbeB5CZ90XE+mNssxEwOGL53s469bKrrio65C5ZAqedBrvsUnZFkiRJkkoyWRsYxRjrcswNIw4FDgWYOXPmRNaklTV/ftGU6Oab4YQTYP/97ZArSZIkreLKSAQPRMSGAJ3XB8fY5l5g5LzNjYGFYx0sM0/LzFmZOWu99dYb92L1EgwNwSGHwK67Fs8JveUWH9UiSZIkCSgnjF4ELO2OezBw4Rjb/BrYLSLW6jQu2q2zTr3gscfg6KNh661h/fVhwQI47DA75EqSJEn6m4l+tMs5wO+ALSLi3og4BPgK8K6IuB14V2eZiJgVEacDZOajwPHAtZ2f4zrrNJktXgzf+lbRIff+++HGG+HEE+2QK0mSJOl5JvSe0cw8cBkf7TrGtnOBj45YPgM4Y4JK03hasqTokPuv/wpbbgmXXVY8N1SSJEmSlmGyNjBSr7jyyqJDLsB3vws771xqOZIkSZJ6g2FUK2fePDjiiOJ+0C9/Gd7/fhsTSZIkSVphpge9OIOD8OEPF91xd9+96JDro1okSZIkvUgmCK2YZrN4Vugb3wivfjXcdht86lMwfXrZlUmSJEnqQYZRLd/TT8PJJ8MWW8DDD8PAAJxwArzylWVXJkmSJKmHec+oxrZkCfzoR0WH3L4+uOIKeP3ry65KkiRJ0hRhGNXzXX550SF32jQ46yzYaaeyK5IkSZI0xRhG9d9uvLHokPvnPxcdcvfbDyLKrkqSJEnSFOQ9o4K//AUOPhje/W7Yay+46abiUS0GUUmSJEkTxDC6Klu0qJiOu+22MHNm0SH3k5+0Q64kSZKkCWcYXRU99RTMnl10yG02Yd48OP54eMUryq5MkiRJ0irCe0ZXJUuWwA9/CJ//PGyzDVx1FWy1VdlVSZIkSVoFGUZXFZdeWkzJXX11+MEP4B/+oeyKJEmSJK3CDKNT3fXXFx1y774bTjwR3vteGxNJkiRJKp33jE5V99wDH/wg7Lkn7Ltv0SH3fe8ziEqSJEmaFAyjU82jj8LnPgfbbQebblp0yP3nf4ZKpezKJEmSJOlvDKNTxVNPwUknFR1yWy2YPx+++EVYc82yK5MkSZKk5/Ge0V737LNw9tnwb/9WjIZefTVsuWXZVUmSJEnSchlGe1UmXHJJ0SG3Wi0e2fK2t5VdlSRJkiStEMNoL7ruuiKEDg7CV75SNCiyMZEkSZKkHuI9o73krrvgoINgr71gv/2K+0Lf8x6DqCRJkqSeYxjtBY88Ap/5DGy/PWy+edEh9xOfsEOuJEmSpJ5lGJ3MnnwSvvrVoiHRU08Vzwo99lio1bry9e12m6GhIdrtdle+T5IkSdKqw3tGJ6Nnn4Uf/ACOOaYYDf3tb4tHtnTRwMAA/f39DA8PU6lUaDQa9PX1dbUGSZIkSVOXI6OTSSb86lew7bZw+unwox/Bz37W9SDabrfp7++nVqsxY8YMarUac+bMcYRUkiRJ0rhxZHSymDu36JC7cGExNXfvvUtrTNRsNhkeHqbWmQ5cq9VYtGgRzWaTarVaSk2SJEmSphZHRst2551w4IFF+DzggKJD7j77lNoht16vU6lUaLVaALRaLSqVCvV6vbSaJEmSJE0thtGyLFoEhx0GO+wAW20Ft98Ohx4K08ofrK5WqzQaDVqtFoODg7RaLRqNhqOikiRJksZN15NPRGwB/HjEqk2BYzLzmyO22Rm4ELirs+q8zDyua0VOtLPOgv7+4pmhN98M669fdkXP09fXx+zZs2k2m9TrdYOoJEmSpHHV9TCamQuANwJExGrAEHD+GJtenZl7dbO2rtlgA/jxj2G33cquZLmq1aohVJIkSdKEKHtO6K7AnzPznpLr6K7ddy+7AkmSJEkqVdn3jB4AnLOMz94aETdGxK8i4vXLOkBEHBoRcyNi7kMPPTQxVUqSJEmSxlVpYTQipgN7Az8d4+PrgE0ycxvg28AFyzpOZp6WmbMyc9Z66603McVKkiRJksZVmSOjewDXZeYDoz/IzMczs9V5/0ugEhHrdrtASZIkSdLEKDOMHsgypuhGxKsiigdtRsQOFHU+0sXaJEmSJEkTqJQGRhHxcuBdwMdHrPsEQGaeCuwH/FNEPAM8CRyQmVlGrZIkSZKk8VdKGM3MvwLrjFp36oj33wG+0+26JEmSJEndUXY3XUmSJEnSKsgwKkmSJEnqOsOoJEmSJKnrDKOSJEmSpK4zjEqSJEmSus4wKkmSJEnqOsOoJEmSJKnrDKOSJEmSpK4zjEqSJEmSus4wKkmSJEnqOsOoJEmSJKnrDKOSJEmSpK4zjEqSJEmSus4wKkmSJEnqOsOoJEmSJKnrDKOSJEmSpK4zjEqSJEmSus4wKkmSJEnqOsOoJEmSJKnrDKOSJEmSpK4zjEqSJEmSus4wKkmSJEnqOsPoCmi32wwNDdFut8suRZIkSZKmhGllFzDZDQwM0N/fz/DwMJVKhUajQV9fX9llSZIkSVJPc2R0OdrtNv39/dRqNWbMmEGtVmPOnDmOkEqSJEnSS2QYXY5ms8nw8DC1Wg2AWq3G8PAwzWaz5MokSZIkqbcZRpejXq9TqVRotVoAtFotKpUK9Xq95MokSZIkqbeVFkYj4u6ImBcRN0TE3DE+j4j494i4IyIGImK7btdYrVZpNBq0Wi0GBwdptVo0Gg2q1Wq3S5EkSZKkKaXsBkbvyMyHl/HZHsBmnZ83A6d0Xruqr6+P2bNn02w2qdfrBlFJkiRJGgdlh9Hl2Qf4fmYm8PuIqEfEhpl5X7cLqVarhlBJkiRJGkdl3jOawCUR8aeIOHSMzzcCBkcs39tZ9xwRcWhEzI2IuQ899NAElSpJkiRJGk9lhtG3ZeZ2FNNxGxGx06jPY4x98nkrMk/LzFmZOWu99dabiDolSZIkSeOstDCamQs7rw8C5wM7jNrkXmDGiOWNgYXdqU6SJEmSNJFKCaMRUY2INZe+B3YD5o/a7CLgQ52uum8BHivjflFJkiRJ0vgrq4HRBsD5EbG0hh9m5sUR8QmAzDwV+CWwJ3AH8FfgwyXVKkmSJEkaZ6WE0cy8E9hmjPWnjnifQKObdUmSJEmSuqPMBkaSJEmSpFWUYVSSJEmS1HVRzIadGiLiCWBB2XVIK2hd4OGyi5BeBM9Z9RrPWfUaz1n1mi0yc82V3bmsBkYTZUFmziq7CGlFRMRcz1f1Es9Z9RrPWfUaz1n1moiY+1L2d5quJEmSJKnrDKOSJEmSpK6bamH0tLILkF4Ez1f1Gs9Z9RrPWfUaz1n1mpd0zk6pBkaSJEmSpN4w1UZGJUmSJEk9YEqE0YjYPSIWRMQdEXFk2fVIo0XEjIi4MiJuiYibIuLTnfVrR8SlEXF753WtsmuVloqI1SLi+oj4RWf5tRHxh875+uOImF52jdJSEVGPiHMj4tbOtfatXmM1mUXE/+v8m2B+RJwTEWt4ndVkEhFnRMSDETF/xLoxr6tR+PdOHhuIiO1W5Dt6PoxGxGrAHGAPYCvgwIjYqtyqpOd5BvhsZr4OeAvQ6JynRwKXZ+ZmwOWdZWmy+DRwy4jlrwInd87XRcAhpVQlje1bwMWZuSWwDcW56zVWk1JEbAR8CpiVmW8AVgMOwOusJpfvAbuPWres6+oewGadn0OBU1bkC3o+jAI7AHdk5p2ZuRj4EbBPyTVJz5GZ92XmdZ33T1D8I2kjinP1rM5mZwH7llOh9FwRsTHwj8DpneUAdgHO7Wzi+apJIyJeAewEfBcgMxdnZhOvsZrcpgEvi4hpwMuB+/A6q0kkM38DPDpq9bKuq/sA38/C74F6RGz4Qt8xFcLoRsDgiOV7O+ukSSkiXgNsC/wB2CAz74MisALrl1eZ9BzfBA4HlnSW1wGamflMZ9lrrSaTTYGHgDM7U8tPj4gqXmM1SWXmEPB14C8UIfQx4E94ndXkt6zr6kplsqkQRmOMdbYI1qQUETXgZ8Bhmfl42fVIY4mIvYAHM/NPI1ePsanXWk0W04DtgFMyc1ugjVNyNYl17rPbB3gt8GqgSjHNcTSvs+oVK/XvhKkQRu8FZoxY3hhYWFIt0jJFRIUiiJ6dmed1Vj+wdApD5/XBsuqTRngbsHdE3E1x68MuFCOl9c50MvBaq8nlXuDezPxDZ/lcinDqNVaT1TuBuzLzocwcBs4D/gdeZzX5Leu6ulKZbCqE0WuBzTrdx6ZT3Px9Uck1Sc/Rud/uu8AtmfmNER9dBBzceX8wcGG3a5NGy8yjMnPjzHwNxTX1isw8CLgS2K+zmeerJo3MvB8YjIgtOqt2BW7Ga6wmr78Ab4mIl3f+jbD0nPU6q8luWdfVi4APdbrqvgV4bOl03uWJzN4f/Y+IPSn+13414IzMPKHkkqTniIgdgauBefz3PXhHU9w3+hNgJsVfTO/PzNE3ikuliYidgc9l5l4RsSnFSOnawPXABzLz6TLrk5aKiDdSNNyaDtwJfJjiP929xmpSiogvAvtTdNy/HvgoxT12Xmc1KUTEOcDOwLrAA8CxwAWMcV3t/KfKdyi67/4V+HBmzn3B75gKYVSSJEmS1FumwjRdSZIkSVKPMYxKkiRJkrrOMCpJkiRJ6jrDqCRJkiSp6wyjkiRJkqSuM4xKkiRJkrrOMCpJmvIiYoOI+GFE3BkRf4qI30XEe1biOP/1Ird/S0T8ISJuiIhbIuILnfV7R8SRL/b7xzj+hhHxi5d6nDGOOz0ifhMR08b72JIkLeVzRiVJU1rnQdz/BZyVmad21m0C7J2Z3x617bTMfGYcv3sB8L8y88aIWA3YIjNvHsfjnwT8NjMvHK9jjjj2scAdmXn2eB9bkiRwZFSSNPXtAixeGkQBMvOepUE0Iv5PRPw0In4OXBIRtYi4PCKui4h5EbHP0v0iotV53TkiroqIcyPi1og4uxN6R1sfuK/znc8uDaKd7/xO5/0NI36ejIi3R0Q1Is6IiGsj4vqRNYzyPuDiEce8ICJ+HhF3RcQnI+Iznf1/HxFrd7a7KiJO7ox83hIR20fEeRFxe0R8acSxLwAOWpnfcEmSVoTTbyRJU93rgeteYJu3Altn5qOdqanvyczHI2Jd4PcRcVE+fyrRtp1jLwSuAd4G/HbUNicDCyLiKorQeFZmPjVyg8x8I0BE/E/gcIpR3C8CV2TmRyKiDvwxIi7LzPbS/SLitcCizHx6xOHe0KlrDeAO4IjM3DYiTgY+BHyzs93izNwpIj4NXAi8CXgU+HNEnJyZjwDzge1f4PdNkqSV5sioJGmVEhFzIuLGiLh2xOpLM/PRpZsAX46IAeAyYCNggzEO9cfMvDczlwA3AK8ZvUFmHgfMAi4B/jedUcwxatoMOAnYPzOHgd2AIyPiBuAqinA5c9RuGwIPjVp3ZWY+kZkPAY8BP++snzeqvotGrL8pM+/rhNo7gRmd2p8FFkfEmmPVLEnSS+XIqCRpqruJYjorAJnZ6Ix4zh2xTXvE+4OA9YA3ZeZwRNxNEQZHGzki+SzL+Ds1M/8MnBIR/wk8FBHrjPw8IqrAT4CPZebCpauB92XmguX8up4co66RNS0ZsbxkVH1Pj7HNWNutDjxnJFeSpPHiyKgkaaq7AlgjIv5pxLqXL2f7VwIPdoLoO4BNVvaLI+IfR9xLuhlFaG2O2uxM4MzMvHrEul8D/3fpvhGx7RiHv40xRmPHSyc0P9QZqZUkadwZRiVJU1rnXs99gbd3Gvv8ETgLOGIZu5wNzIqIuRSjpLe+hK//IMU9ozcAPwAO6kx/Bf7W1Xc/4CMjmhjNAo4HKsBARMzvLI/+dbUp7vH8+5dQ3/K8A/jlBB1bkiQf7SJJUq/qPCv1TZn5+Qk49nnAUS8wVViSpJXmPaOSJPWozDx/9D2o4yEipgMXGEQlSRPJkVFJkiRJUtd5z6gkSZIkqesMo5IkSZKkrjOMSpIkSZK6zjAqSZIkSeo6w6gkSZIkqev+P1o7APuuPuXcAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# The transform function should calculate the result for new observations, but doesn't seem to work\n",
    "# let's just use piece-wise linear interpolation from NumPy.\n",
    "#y_predict_test = iso_reg.transform(X_test)\n",
    "y_predict_test = np.interp(X_test, X_predict, y_predict, left=None, right=None, period=None)\n",
    "r2 = explained_variance_score(y_test,y_predict_test)\n",
    "print('Variance Explained = ' + str(round(r2,3)))\n",
    "\n",
    "# Plot test predictions\n",
    "plt.subplot(111)\n",
    "plt.scatter(X_train, y_train,  color='black', s = 20, alpha = 0.5, label='train')\n",
    "plt.scatter(X_test, y_test,  color='blue', s = 20, alpha = 0.5, label='test')\n",
    "plt.scatter(X_test, y_predict_test,  color='green', s = 20, alpha = 0.5, label='predicted test')\n",
    "plt.plot(X_predict,y_predict, color='red', linewidth=1, label='model')\n",
    "for threshold in X_predict:\n",
    "    plt.axvline(threshold, color='red', alpha = 0.2)\n",
    "plt.title('Isotonic Regression Porosity from Grainsize with Training Data'); plt.xlabel('Grain Size (mm)'); plt.ylabel('Porosity (%)')\n",
    "plt.xlim(0,100)#; plt.ylim(0,1500000)\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.0, wspace=0.2, hspace=0.2)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's another model with very few isotonic constraints."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Variance Explained = 0.27\n"
     ]
    },
    {
     "data": {
      "image/png": "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Oqauro6amhrS09O1KngMteRvJSLS5vRZ9pgys+XuntvS42O+mm6UazjELbpm9lfAZ+7uZnYukRHcL2MZnIiItA9paWlKQkVERBJQXJJRM+sMXADcFlV2O4C7FwOjgXFmtgfYCfzE4zWEKyIiIiIiIm0uLsmou+8AujUqK456/jjweKzjEhERERERkdiI92q6IiIiIiIi8i2kZFRERERERERiTsmoiIiIiIiIxJySURERkSNUU1PDzJkzW3Ts9OnT2bFjRxtHJCIikryUjIqIiBwhJaMiIiJtJ57fMyoiInLM1dVBTQ2kp0Nrv2504sSJbNy4kZycHC644AJOPvlkXnjhBXbt2sXll1/OAw88QF1dHVdddRVbt25l7969TJo0ic8++4yqqiqGDx9O9+7dWbhwYdu8OBERkSSmZFRERNqtVatg5kyor4eUFCgshMzMlrc3efJkVq9eTXl5OSUlJcybN4/33nsPd+fSSy/lrbfeorq6mlNPPZXf//73AGzfvp0TTzyRqVOnsnDhQrp3795Gr05ERCS56TZdERFpl+rqIoloKAS9e0cei4oi5W2hpKSEkpISBg0axODBg6msrGT9+vVkZmZSWlrKhAkTWLx4MSeeeGLbnFBERKSd0cioiIi0SzU1kRHRUCiyHQrBV19Fylt7uy6Au3Pfffdx2223HbRv+fLlzJ8/n/vuu48RI0Zw//33t/6EIiIi7YxGRkVEpF1KT4/cmhsOR7bD4ch2enrL2+zSpQu1tbUAXHjhhcyePZtwcIJPPvmEzz//nKqqKjp37syYMWMYP348K1asOOhYERER0cioiIi0U2lpkTmiRUWREdGGOaOtGRXt1q0bBQUFDBw4kJEjR3LttdcydOhQAEKhEL/5zW/YsGED99xzD8cddxwpKSk88cQTAIwdO5aRI0dyyimnaAEjERERwNw93jG0mdzcXC8rK4t3GO3LunWRx7POim8cIiJARUUF/fv3P6pj2nI1XTlyLflbiYi0OX2WPabMbLm757b0eI2MiohIu5aWpiRUREQkEWnOqIiIiIiIiMScklERERERERGJOSWjIiIiIiIiEnNKRkVERERERCTmlIyKiIiIiIhIzCkZFRERERERkZhTMioiIhJHoVAIgKqqKkaPHt1s3enTp7Njx46jan/RokVcfPHFze5/5513jqrNBps3b+a5555r0bEiIiJKRkVEpF2r213HJ19/Qt3uupidc+/evUd9zKmnnsq8efOardOSZPRwlIyKiEi8KBkVEZF2a9Vnq7i75G7uX3g/d5fczYeffdjqNjdv3ky/fv248cYbycrKYvTo0ezYsYM+ffrw4IMPMmzYMF588UU2btzIRRddxJAhQ/je975HZWUlAJs2bWLo0KHk5eUxadKkA9odOHAgEElmx48fT2ZmJllZWTz22GPMmDGDqqoqhg8fzvDhwwEoKSlh6NChDB48mCuvvJJwOAzAm2++Sb9+/Rg2bBgvv/xys6+luLiYadOmkZOTw+LFi6muruaKK64gLy+PvLw8lixZAsCf/vQncnJyyMnJYdCgQdTW1jJx4kQWL15MTk4O06ZNa/XvVkREvl06xjuAZFBXV0dNTQ3p6emkpaXFOxwRETkCdbvrmPn+TEKdQoQ6hQjvDlP0fhFTRkwhrVPr+vK1a9fy1FNPUVBQwM0338zMmTMBSE1N5e233wbg/PPPp7i4mL59+/Luu+/ys5/9jAULFnDHHXcwbtw4brjhBoqKippsf9asWWzatIkPPviAjh07sm3bNrp27crUqVNZuHAh3bt354svvuChhx6itLSUtLQ0Hn74YaZOncq9997LrbfeyoIFCzjzzDO5+uqrD/k6+vTpw+23304oFGL8+PEAXHvttdx5550MGzaMjz/+mAsvvJCKigoeeeQRioqKKCgoIBwOk5qayuTJk3nkkUd44403WvX7FBGRbyclo4exatUqZs6cSX19PSkpKRQWFpKZmRnvsERE5DBqvqmhfm89oU6ROZmhTiG+2vkVNd/UtDoZ7d27NwUFBQCMGTOGGTNmAOxP/MLhMO+88w5XXnnl/mN27doFwJIlS3jppZcAuP7665kwYcJB7ZeWlnL77bfTsWPkbbpr164H1Vm2bBlr1qzZH8fu3bsZOnQolZWVZGRk0Ldv3/3xzZo164hfW2lpKWvWrNm//fXXX1NbW0tBQQF33XUX1113HT/+8Y/p1avXEbcpIiLSFCWjzairq2PmzJmEQiFCoRDhcJiioiKmTJmiEVIRkQSXnppOSocUwrvD+0dGUzqkkJ6a3uq2zazJ7Yb3hn379pGenk55efkRHd+Yux9RnQsuuIC5c+ceUF5eXn7YY5uzb98+li5dygknnHBA+cSJExk1ahTz588nPz+f0tLSFp9DREQENGe0WTU1NdTX1+9f6TAUClFfX09NTU2cIxMRkcNJ65RGYV4h4d1htmzfQnh3mMK8wlaPigJ8/PHHLF26FIC5c+cybNiwA/Z/5zvfISMjgxdffBGIJI4rV64EoKCggOeffx6AOXPmNNn+iBEjKC4uZs+ePQBs27YNgC5dulBbWwtAfn4+S5YsYcOGDQDs2LGDdevW0a9fPzZt2sTGjRv3x9ec6DYbzv3444/v325IqDdu3EhmZiYTJkwgNzeXysrKg44VERE5GkpGm5Genk5KSsr+BSHC4TApKSmkp7f+v+oiInLsZfbMZMqIKTw4/EGmjJhCZs+2mWbRv39/nn32WbKysti2bRvjxo07qM6cOXN46qmnyM7OZsCAAbz22msAPProoxQVFZGXl8f27dubbP+WW27h9NNPJysri+zs7P0r1o4dO5aRI0cyfPhwevTowTPPPMM111xDVlYW+fn5VFZWkpqayqxZsxg1ahTDhg3jjDPOaPa1XHLJJbzyyiv7FzCaMWMGZWVlZGVlcc4551BcXAxEVvIdOHAg2dnZnHDCCYwcOZKsrCw6duxIdna2FjASEZGjZu4enxObbQZqgb3AHnfPbbTfgEeBHwI7gJ+6+4rm2szNzfWysrI2jfPDDz+kqKjo2ztndN26yONZZ8U3DhERoKKigv79+8c1hs2bN3PxxRezevXquMaR6BLhbyUios+yx5aZLW+cxx2NeM8ZHe7uXxxi30igb/Dz18ATwWNMZWZmMmXKFK2mKyIiIiIi0obinYw25zLg1x4Zul1mZulmdoq7fxrrQNLS0pSEiogIEPk6lGQcFX366ad59NFHDygrKCg45NfLiIiIHGvxTEYdKDEzB/7T3RuvO38asCVqe2tQdkAyamZjgbEAp59++rGLVkREJInddNNN3HTTTfEOQ0REZL94LmBU4O6DidyOW2hm32+0v6l16Q+a4Orus9w9191ze/TocSziFBGRBBKvtQ7kyOlvJCIiRyJuyai7VwWPnwOvAOc2qrIV6B213Quoik10IiKSiFJTU/nyyy+V7CQwd+fLL78kNTU13qGIiEiCi8ttumaWBhzn7rXB8xHAg42qvQ783MyeJ7Jw0fZ4zBcVEZHE0atXL7Zu3Up1dXW8Q5FmpKam0qtXr3iHISIiCS5ec0Z7Aq9Evr2FjsBz7v6mmd0O4O7FwHwiX+uygchXu2iii4jIt1xKSgoZGRnxDkNERETaQFySUXf/CMhuorw46rkDhbGMS0RERERERGIjngsYiYiIiIiIyLeUklERERERERGJOWtPKxKaWS2wNt5xiByh7sAX8Q5C5CjompVko2tWko2uWUk2Z7t7l5YeHK8FjI6Vte6eG+8gRI6EmZXpepVkomtWko2uWUk2umYl2ZhZWWuO1226IiIiIiIiEnNKRkVERERERCTm2lsyOiveAYgcBV2vkmx0zUqy0TUryUbXrCSbVl2z7WoBIxEREREREUkO7W1kVERERERERJJAu0hGzewiM1trZhvMbGK84xFpzMx6m9lCM6swsz+b2R1BeVcz+4OZrQ8eT4p3rCINzKyDmX1gZm8E2xlm9m5wvf7WzDrFO0aRBmaWbmbzzKwy6GuHqo+VRGZmdwafCVab2VwzS1U/K4nEzGab2edmtjqqrMl+1SJmBPnYKjMbfCTnSPpk1Mw6AEXASOAc4BozOye+UYkcZA9wt7v3B/KBwuA6nQj80d37An8MtkUSxR1ARdT2w8C04Hr9Cvj7uEQl0rRHgTfdvR+QTeTaVR8rCcnMTgP+Ech194FAB+AnqJ+VxPIMcFGjskP1qyOBvsHPWOCJIzlB0iejwLnABnf/yN13A88Dl8U5JpEDuPun7r4ieF5L5EPSaUSu1WeDas8CP4pPhCIHMrNewCjgV8G2AT8A5gVVdL1KwjCz7wDfB54CcPfd7l6D+lhJbB2BE8ysI9AZ+BT1s5JA3P0tYFuj4kP1q5cBv/aIZUC6mZ1yuHO0h2T0NGBL1PbWoEwkIZlZH2AQ8C7Q090/hUjCCpwcv8hEDjAduBfYF2x3A2rcfU+wrb5WEsl3gWrg6eDW8l+ZWRrqYyVBufsnwCPAx0SS0O3ActTPSuI7VL/aopysPSSj1kSZlgiWhGRmIeAl4J/c/et4xyPSFDO7GPjc3ZdHFzdRVX2tJIqOwGDgCXcfBNShW3IlgQXz7C4DMoBTgTQitzk2pn5WkkWLPie0h2R0K9A7arsXUBWnWEQOycxSiCSic9z95aD4s4ZbGILHz+MVn0iUAuBSM9tMZOrDD4iMlKYHt5OB+lpJLFuBre7+brA9j0hyqj5WEtXfAZvcvdrd64GXgb9B/awkvkP1qy3KydpDMvo+0DdYfawTkcnfr8c5JpEDBPPtngIq3H1q1K7XgRuD5zcCr8U6NpHG3P0+d+/l7n2I9KkL3P06YCEwOqim61UShrv/L7DFzM4Ois4H1qA+VhLXx0C+mXUOPiM0XLPqZyXRHapffR24IVhVNx/Y3nA7b3PMPflH/83sh0T+a98BmO3u/x7nkEQOYGbDgMXAh/z/HLx/JjJv9AXgdCJvTFe6e+OJ4iJxY2bnAePd/WIz+y6RkdKuwAfAGHffFc/4RBqYWQ6RBbc6AR8BNxH5p7v6WElIZvYAcDWRFfc/AG4hMsdO/awkBDObC5wHdAc+A34BvEoT/WrwT5XHiay+uwO4yd3LDnuO9pCMioiIiIiISHJpD7fpioiIiIiISJJRMioiIiIiIiIxp2RUREREREREYk7JqIiIiIiIiMScklERERERERGJOSWjIiIiIiIiEnNKRkVEpN0zs55m9pyZfWRmy81sqZld3oJ23jnK+vlm9q6ZlZtZhZn9a1B+qZlNPNrzN9H+KWb2RmvbaaLdTmb2lpl1bOu2RUREGuh7RkVEpF0Lvoj7HeBZdy8Oys4ALnX3xxrV7ejue9rw3GuBq9x9pZl1AM529zVt2P4vgbfd/bW2ajOq7V8AG9x9Tlu3LSIiAhoZFRGR9u8HwO6GRBTA3f/SkIia2U/N7EUz+x1QYmYhM/ujma0wsw/N7LKG48wsHDyeZ2aLzGyemVWa2Zwg6W3sZODT4Jx7GxLR4JyPB8/Lo352mtnfmlmamc02s/fN7IPoGBq5Angzqs1Xzex3ZrbJzH5uZncFxy8zs65BvUVmNi0Y+awwszwze9nM1pvZQ1Ftvwpc15JfuIiIyJHQ7TciItLeDQBWHKbOUCDL3bcFt6Ze7u5fm1l3YJmZve4H30o0KGi7ClgCFABvN6ozDVhrZouIJI3Puvs30RXcPQfAzC4B7iUyivsAsMDdbzazdOA9Myt197qG48wsA/jK3XdFNTcwiCsV2ABMcPdBZjYNuAGYHtTb7e7fN7M7gNeAIcA2YKOZTXP3L4HVQN5hfm8iIiItppFRERH5VjGzIjNbaWbvRxX/wd23NVQB/sPMVgGlwGlAzyaaes/dt7r7PqAc6NO4grs/COQCJcC1BKOYTcTUF/glcLW71wMjgIlmVg4sIpJcnt7osFOA6kZlC9291t2rge3A74LyDxvF93pU+Z/d/dMgqf0I6B3EvhfYbWZdmopZRESktTQyKiIi7d2fidzOCoC7FwYjnmVRdeqinl8H9ACGuHu9mW0mkgw2Fj0iuZdDvKe6+0bgCTN7Eqg2s27R+80sDXgBuNXdqxqKgSvcfW0zr2tnE3FFx7Qvantfo/h2NVGnqXrHAweM5IqIiLQVjYyKiEh7twBINbNxUWWdm6l/IvB5kIgOB85o6YnNbFTUXNK+RJLWmkbVngaedvfFUWX/A/xDw7FmNqiJ5tfRxGhsWwmS5upgpFZERKTNKRkVEZF2LZjr+SPgb4OFfd4DngUmHOKQOUCumZURGSWtbMXprycyZ7Qc+C/guuD2V2D/qr6jgZujFjHKBf4NSAFWmdnqYLvx66ojMsfzzFbE15zhwPxj1LaIiIi+2kVERCRZBd+VOsTd/+UYtP0ycN9hbhUWERFpMc0ZFRERSVLu/krjOahtwcw6Aa8qERURkWNJI6MiIiIiIiISc5ozKiIiIiIiIjGnZFRERERERERiTsmoiIiIiIiIxJySUREREREREYk5JaMiIiIiIiISc/8HUUO89MdrxKEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Let's try varying the number of isotonic constraints, thresholds\n",
    "number_isotonic_constraints = 2\n",
    "X_predict = np.linspace(10,90,number_isotonic_constraints)\n",
    "iso_reg = IsotonicRegression().fit(X_train, y_train)\n",
    "y_predict = iso_reg.predict(X_predict)\n",
    "\n",
    "# Make predictions at testing data locations and calculate the model goodness\n",
    "y_predict_test = np.interp(X_test, X_predict, y_predict, left=None, right=None, period=None)\n",
    "r2 = explained_variance_score(y_test,y_predict_test)\n",
    "print('Variance Explained = ' + str(round(r2,3)))\n",
    "\n",
    "# Plot test predictions\n",
    "plt.subplot(111)\n",
    "plt.scatter(X_train, y_train,  color='black', s = 20, alpha = 0.5, label='train')\n",
    "plt.scatter(X_test, y_test,  color='blue', s = 20, alpha = 0.5, label='test')\n",
    "plt.scatter(X_test, y_predict_test,  color='green', s = 20, alpha = 0.5, label='predicted_test')\n",
    "plt.plot(X_predict,y_predict, color='red', linewidth=1, label='model')\n",
    "for threshold in X_predict:\n",
    "    plt.axvline(threshold, color='red', alpha = 0.2)\n",
    "plt.title('Isotonic Regression Porosity from Grainsize with Training Data'); plt.xlabel('Grain Size (mm)'); plt.ylabel('Porosity (%)')\n",
    "plt.xlim(0,100)#; plt.ylim(0,1500000)\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.0, wspace=0.2, hspace=0.2)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's run multiple models with variable number of isotonic constraints to perform a rough hyperparameter tuning.\n",
    "\n",
    "* simple test and train split. cross validation\n",
    "\n",
    "* model goodness by variance explained"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5kAAAFdCAYAAACJsKmtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XeYnGXV+PHvSUJooUiTGkENCD9FgdCsFFEgoYkI+lqwIQqiIhZeEVEBBRQQxVexgagUFQQpUsSGSgldEpDQJBSlJwSElPP7456FZdkyO/s8szvZ7+e69srO7PPcc6bsZs6c+z53ZCaSJEmSJFVhzHAHIEmSJEladJhkSpIkSZIqY5IpSZIkSaqMSaYkSZIkqTImmZIkSZKkyphkSpIkSZIqY5IpSUMQERMj4omIGDvcsbRb436/dLjjaFZEbBURNw93HFWIiMMj4uRhvP2vR8TDETFruGIYjIj4YkR8b7jjaKeIuDUi3jDccUganUwyJXWUiLgrIt48xDH+GBEfqiKezPxXZk7IzAWDjGHviFjQSNRmR8QNETG1ipjapXG/76hyzMbj0fW1MCKe6nb5f4Yydmb+MTP/X1WxdhcRlzdiXb3bddtHxMw6bm84RcQ6wAHAepm5Zi8/f3NE3DXE23h5RFS2kXdmfjUz920xlh0i4i8RMSci/tP4+zGlqth6ub1K7ntmrpeZf2nyNmdFxFZDvU1J6mKSKUnD5++ZOQFYHvgucHpELF/1jUTEuKrHrEsjcZ3QeFz+BezU7bqfD3d8A3gSOGS4gxisFl4fLwH+k5kP1RHPSBIRewFnAD8G1gBWA74M7DzMcXXM77Sk0ckkU1LHanzi/6eIeDwiHoqIM7r97LURcXXjZ1dHxGsb1x8BvAH4TqM69p3+jm/87I8R8dWI+GujmnFxRKzU+NnaEZFdb/oiYoWI+ElE3BcRj0bEbwa6H5m5EDgVWBqY1O12t4iIv0XEY41K51bdfrZORPy5Ec+lEXFiRPysR0wfjIh/AZc1Md7eEXFHY7w7u6qGAzzGGREvb3y/XET8NCIejIi7I+KQiBjTbezLI+IbjcfkzojYobln+fki4mcRcVi3y8+rmjUqMgdGxE2NmE+LiMUHe2zj5wdHxAMRcW9EfLhxf9fuJ7xvAe9pVPp6xj2u5/nd70tXbI3bfLDx+tkpIqZGxG0R8UhEfLbHsEtGxC8bz9m0iHhVt7HXjIizG2PdGRH7dfvZ4RFxRuP+zgHe3Uu8yzfie7BbXBER2wMXAl3TxH/Yz+PRNdYHG2PMabzG9mpcPyYiDm28Xv4TESdHxLKN0/7cOKarir1pf8c3XqcZEe9tPK8PRsTne9znk7tdfmNEXNF43u+JiPf0EvcY4JvAlzLzJ5k5OzMXZOYfMvMjA92HJmLaIiKujTKT4d8RcUw/9/1DUX7fT4iIR4BDImJSRPwhyrTlhyLi1IhYrtv4z1YnG/f/tMZzOici/hERGzd+dhqwOnBh4/YOjIilIuIXjbEfi4irovE3T5KaYZIpqZN9FbgYeBGwJvBtKIkecD5wArAicCxwfkSsmJlfAP4C7N+oju3f3/HdbutdwPuBVYDxwEF9xHQqsBTw/xrHHjfQnYiynvP9wDzg7sZ1azRiOhxYoXF7v46IlRun/QK4qhHvYcAL3iQDbwLWB97a33gRsXTjvu+QmcsArwWub4zR62Pci28DywEvbdzuexv3qcvmwK3ASsDRwI8iIgZ6bFr0DmC7Riyb0Ptj0++xUaYufxzYGlgX2KaJ2/0X8BPgSy3GvSbl/+XVKY/7j4C9gI2ArYCvRMTEbse/jfI6WAH4FXB2lGR2LHAecDWl+rYd8JmI2Lbbubs1zl2OUqnr6buU1/FLKff9g8B7M/N3wE5A1zTxfqedNxKuY4HtGq+t1wE3Nn78IUqCuxXwMspr7FuNn70RnlfZvnqA47u8Fng58FbgyxExqcfPu6b7nt+Ia0XK43tTL+FvQHkuftXPXRxKTN8GjsnMZRs/77qd3u571zgzgJWBo4Cg/D6v1oj1pcAX+4l1V8rfp+UpHxSc0LiddwL3UX7/J2TmsZTf3aUor8kVgY8B/+1nbEl6HpNMSZ1sHmXq3uqZ+d/MvLxx/RTgtsw8NTPnZ+ZpwC2UN8e9aeb4n2TmPzPzKeBM4DU9B4mI1YAdgH0z89HMnJeZf+on/i0i4jHKm7dvAO/OzP80fvZu4ILMvCAzF2bmJcA0YMdGorEpcGhmPtO43+f2Mv5hmTm3EXOf4zWOXQi8MiKWzMz7M7OrQU5fj3H3+z0W2BM4ODPnZOZdlApQ9+Tu7sz8QWPt6imUN8Yv7uexGYrjM/OBzHyYkmy94Llq4th3AD/KzBmZOZcyRbIZRwJvi4hXtBD3f4GvZ+Y84HRKMnFcZj6RmTdSkvQNux1/ZWae3Tj+GGBZyutiC2DZzDyy8fqYyXMJa5fLM/O3jdfCU92DiIjFKPf/843n8w7KhyX9Jev9Scpra4nGa2t64/r/Ab6RmXdm5hzgf4F3NSqIvWnm+MMar9NrgZuBV/cyzruB32XmmY3f94cy8/pejuv6kOn+fu7bUGKaB0xqfPg1JzOv7Od2oCT2/9eopj7V+Hv0+8Zz/B/Kc/Smfs7/U2Ze1PgdPJX+fy/mUT4Qennj9qZl5hMDxCdJzzLJlNTJPkv5NP+qiLg5Ij7QuH51GhXBbu6mVHV608zxD3T7/klgQi/jrAU8kpmPNhE7wBWZuTyl+nEuZRpvl5cAezSmqj3WSEZfT0nOVm/czpPdjr+nl/G7X9fneI0kak9gX+D+iDi/W5LU12Pc3UqU6m73x7DPx69b3L09hlVo5rka6NjVef7j19vj+wKZ+QDwfzSflHb3UD7XQKor8ft3t58/xfPvy7MxNc67lxL3SyjTWbs/158FVu3t3F6sAoyl/+ezKZk5G3gnsB/wQEScFxHrNn7c8/fubsrraGV6N+Dxjce/S3+/p7c3Ef7DjX9X6+eYocT0fkoF8tbGdNQd6d/znrOIWDUizowynXs2cDLld7EvPeNYup9jTwYuBbrG/3q4DlTSIJhkSupYjQrUhzNzdeAjwHejrBG8j/JGu7uJlDfhUCor3Q10fLPuAVaIQTbvaVQIPkZZz7dRt7FOzczlu30tnZlfp1RWVoiIpboNs1ZvQ/eIra/xaFQ4tqO8ob4F+EHj+r4e4+4e4rmKZ5dWHr9mzKVM4+uyal8HDtH9lKmCXXp7fPtyFPAWulWKMnM+8DTVxv5sTI3K2RqU1/I9lMp89+d6mczsXpnvr3vpf4AFVPR8ZuaFmflmymtrJvD9xo96/t5NBJ4BHuwjvv6OH4x7KFNbBzK9cZu793NMyzFl5q2ZuRclqf8mZfr6EvT93PS8/ijKa+pVWabc7k35QKgVzxu7UR09LDPXp3wYtRulaitJTTHJlNSxImKPiOhKBB6lvFFaAFwArBsR72qsUduTUjE4r3Hsvynrl7oMdHxTMvN+ylqn70bEiyJisYh4Y5PnPgz8EDi0cdXPgJ0i4q0RMTYiloiyz+OamXk3ZarrYRExPiK2pO+pwF36HC8iXhwROzfWZj4NPEF5HPt7jLvHvoAyhfiIiFgmIl4CHNi4zapdD0xpPL6rUbbSqMOZwAcjYr1GMt/fWrfnycxHgOOBz/T40Q3A/zQe/ymUN+9DsVlE7NKY3noQMIeyDvPvwDMR8enG8zw2Il4VEZs0Gf88yvrAIyNiQmMN46do4fmMiNWiNDBaipJ8zeW5189pwIFRGlUtAxwBnJalEdZ/gIzn78Pa3/GD8TNg+4jYvfH7vlJEvGBabWPcT1N+z94XEctGafTzhnhuz82WY4qI90TESo1jH6f8bvV133uzDOXxfDwi1qLvdeLNeN7fxIjYJiJe2fjwYjblQ6RBbdMkaXQzyZTUyTYFroyIJyjTTT/RWBv1MDCV8gbxYcpUwan53JYL3wLeHqXT6QlNHD8Y76G8IbuF8mbxk4M493jKmssNM/MeYBfKGq8HKdWXz/Dc3+3/AbZsxHs4pXnL030NPMB4Yyj3/T7gEcq6ro81Tu31Me7lJj5OecN7B3A5panMjwdx35t1MqX5yd3A7yhrFyuXmb+lTHv9M3Ab8NfGj/p8jHs4jhdWng6gVIQeA/ag93W0g3E2ZX3hI5Tpzm9rrDGcT1lruxlwF6XS/H3Kms1mfYySFN4J/ImyjvanLcQ4lvI6u5/yWn0tsH/jZz+gvG7/QnndzAE+AdBY3/g1ymvvsYiY3N/xg9F4/e4EfI7y2F0LvKqPY0+nNP36MOX34wHgK8A5A92HJuwIzIjS4fcbwJ6NCmJv9703X6I8x49TXku/bvJ2e3MkpSnRYxHxSco04LMoCebNlKmzpw1hfEmjTGRWttexJGmYRNla5JbMbLWzqfoRZXuQa4HFW6icSZI0qljJlKQOFGXvvJc1pu9tT6lSDrgnp5oXEbs1piOvCHwdOMcEU5KkgdWaZEbE9hFxa0TMjG4bEPc45h0RMb3RtfAXdcYjSYuQVYE/UtZPngB8NDOvG9aIFj37Uaaa3kbZXmS/4Q1HkqTOUNt02Sj7pv2Tsgn0LEozgnd22x+LKBsSnwlsk5mPRsQq+dwecZIkSZKkDlNnJXMzYGZm3pGZz1CaM+zS45gPAyd27SlngilJkiRJna3OJHMNnr9x8CxeuJHzupRtA/4aEVc01hVJkiRJkjrUuBrH7m1D4J5zc8cBk4CtKJte/yUiXpmZjz1voIh9gH0All566U1e8YpXVB+tJEmSJOl5rrnmmocyc+XBnFNnkjkLWKvb5TUpe0z1POaKxsbPd0bErZSk8+ruB2XmScBJAJMnT85p06bVFrQkSZIkqYiIuwd7Tp3TZa8GJkXEOhExHtiLF248/Rtga4CIWIkyffaOGmOSJEmSJNWotiQzM+cD+wMXATOAMzPz5oj4SkTs3DjsIuDhiJgO/AH4TGY+XFdMkiRJkqR61baFSV2cLitJkiRJ7RER12Tm5MGcU+d0WUmSJEnSKGOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkyJpmSJEmSpMqYZEqSJEmSKmOSKUmSJEmqjEmmJEmSJKkytSaZEbF9RNwaETMj4vO9/HzviHgwIq5vfH2ozngkSZIkSfUaV9fAETEWOBHYDpgFXB0R52bm9B6HnpGZ+9cVhyRJkiSpfWpLMoHNgJmZeQdARJwO7AL0TDI1Elx2Gcye3dq5W28Nyy1XbTySJEmSOlKdSeYawD3dLs8CNu/luN0j4o3AP4FPZeY9vRyjOs2dC299K0yZMvhzr78eDjkEPuRMZ0mSJEn1JpnRy3XZ4/JvgdMy8+mI2Bc4BdjmBQNF7APsAzBx4sSq49Ts2bDiivCb3wz+3AMPhMceqz4mSZIkSR2pzsY/s4C1ul1eE7iv+wGZ+XBmPt24+ANgk94GysyTMnNyZk5eeeWVawl2VJszB5ZdtrVzl1uu9Wm2kiRJkhY5dSaZVwOTImKdiBgP7AWc2/2AiFit28WdgRk1xqO+zJ4NyyzT2rnLLQePP15tPJIkSZI6Vm3TZTNzfkTsD1wEjAV+nJk3R8RXgGmZeS5wQETsDMwHHgH2rise9WMolcxllzXJlCRJkvSsOtdkkpkXABf0uO7Qbt8fDBxcZwxqgpVMSZIkSRWpc7qsOoVrMiVJkiRVxCRTVjIlSZIkVcYkU67JlCRJklQZk0xZyZQkSZJUGZNMuSZTkiRJUmVMMjW0SuYSS8DChfD009XGJEmSJKkjmWRqaJXMCNdlSpIkSXqWSaaGVskE12VKkiRJepZJpkolc6hJpusyJUmSJGGSKSgJYqvTZcFKpiRJkqRnmWRq6JVM12RKkiRJajDJlJVMSZIkSZUxyRztMuGJJ2DChNbHcE2mJEmSpAaTzNFu7tyy1+W4ca2PYSVTkiRJUsMQMgstEoa6HhPKVNv//KeaeCRJGox582DBgtbOXWKJamORJAEmmRrqekwolczbbqsmHkmSmjV7Nqy2WmtJ5oIF8MlPwjHHVB+XJI1yJpmjXRWVTNdkSpKGw9VXw0YbweWXD/7cRx+FLbaASZNgn32qj63TLVgATz3V2rlDXYYjqeP5F2C0mzOnmkqmazIlSe121VWw+eatnfuiF8F558HrXw8vfzlss021sXW6ffeFU09tLVlccUX4/e/L46rnu+km2Gqr1qrviy8O557b+mteaiOTzNFu9uxq1mSaZEqS2u3KK+Gd72z9/EmT4PTTYa+94C9/gXXXrS62TnfNNfDnP8Nmmw3+3JNOgm23hcsug5e9rPrYOtn115cPNH7wg8Gfe/bZsN9+5cOVMfbu1Mg2YJIZEdcB2ePqx4FpwNcy85E6AlObWMmUJHWizJJkHn/80MbZems44giYOhWuuAJWWKGa+DrZwoVw662w/vqtnb/PPuX52WYb+MMf4KUvrTa+TjZzZnlcl19+8OfuvTf86Efwk5/ABz9YeWhSlZqpZF4CBPCLxuW9gAXAE8DJwM61RKb2qKKS6ZpMSVK7zZpVkqGXvGToY33oQ3DLLfD2t8Pvfgfjxw99zE52990l2R7K+4OPfKQ8P9tsA3/8I6y9dlXRdbaZM2H77Vs7NwK+/W3YcUfYfffWElWpTZqptb82Mz+Tmdc1vj4HvDEzjwTWqTk+1c1KpiSpE115ZZnKGVHNeEcdBUsvXaYjZs8JXKPMjBmwwQZDH+ejH4XPfKZUi++6a+jjLQpuu21oa1U32gh22QUOO6yykKQ6NJNkLhMRm3RdiIiNga6sZH4tUal9qqhkTpgATz7Z+j5lkiQN1lCa/vRm7Fj4xS/KuMcdV924nWj69Nanyva0335w4IGlonn33dWM2clmzhx6Q6TDDy+v1ZtvriYmqQbNTJf9CHBqRCxGmTb7DPDBiFgaOLrO4NQGc+bAi188tDHGjCmJ5uzZpVufJKl+Tz1VtuCYMaO189//fvj+96uNqZ2uvBK+8IVqx1xmGfjtb8vj+u9/l5k6g7XKKmW9XFUV1uEwfXp5DKry8Y+XqbNbb12mzk6cWN3YneSRR8oH8iutNLRxVloJDj0UDjgALr20s19rWmQNmGRm5hXABhGxIhCZ+VC3H59WW2RqjyoqmfDcukyTTElqj6OPLhWRq68e/LlPPgkbblg6qr7hDdXHVrf58+Haa2HTTasfe+LEsi7z9NPhiScGf/5PflI+vN1pp+pja5cZM+ADH6h2zE98okxDnjy5tXW0EXDMMfCmN1UbVzt1VTGrSAr33bd08T3rrLI+UxphmukuOx7YFVgbGBeNX4zGmkx1uirWZILrMiWpne64ozQAufba1prUjB9f3rB//ONlq4qxY6uPsU7Tp8Pqq9f3weaGG5avVrzudWUd4g47tLbH5HDLrHa6bHef/CS89a2tJe+//z184xudn2ROmlTNWOPGwQknlI6zO+wASy1VzbhSRZr563c28F/gGkpXWS1KqqpkulemJLXPJz8JBx00tGmH73gHfO97Zcrsxz5WXWztcOWVI3dD+h13LAn8ySeXrrWd5v77YYklYMUV6xm/1eR1/fXh618v05iHusxnuAy16U9PW21Vfg+OPtpGQBpxmkkyX5KZr6w9Eg0PK5mS1FnOO6/sYfirXw1tnK7tELbZBvbYA1ZeuZr42qHqpj9Viihv+t/2NnjnO0vH2k5SVxVzqCZMKF1VTzutfMjSiWbOhG23rXbMY46BjTcuFU23idEI0kx32SsiooI+1hqRql6TKUmqz1NPlbVt3/52NXs5vvKV8K53Vd9Ap25d25eMVJttVqbNHn/8cEcyeNOnV7N9SR3e+1445ZThjqJ1VXSW7WnixOdmNkgjSDOVzM2B6yJiJvA0pcNsZubGtUam9rCSKaluc+aUpOiZZwZ/7uKLl3WDEyZUH1cnOvrosk/eW95S3ZiHHVYqV9OmlaYsI90TT8Dtt8OrXz3ckfTviCNKh9Z99umsKvGMGfD//t9wR9G7rbeGhx+GG29sfc3scKojyYSSYG6wAey8c2sfPr3udfCpT1Ufl0a1ZpLMXWuPQsPHNZmS6nbqqXDuubD99oM/95JLSpJ6pL3mntfsp0rLL18e3/33h7/9rWxLNZJdcw286lXVVHLr9PKXl+myhx8O3/rWcEfTvOnT4e1vH+4oejdmDLz73fDTn5YmQJ3kscfgv/+tZz3pEkuUrUxa+dswf375IORDH6rm/aDU0GeSGRFLZ+Zc4ME2xqN2yiyfCFc1XdYkU1Jvzj67dNtspc3+vfeWisVHPtLatgeLkk9+Ej796Xr2GHzf+0oDoJ/+tKztGslGctOfnr74xVJhOuAAeNnLhjua5syYMXKny0KZMrv11qUJUCd177399uq2L+nNS19avlpxyilw/vmw117VxqRRrb+PK7s6CtwM/KOXf9Xp5s4tn35V0breNZmSevPooyUpaKWKCbDGGuUN+sEHVxtXp+lq9nPggfWMP2YMfOc75XEe6R8YjuSmPz2tskr5cKBT1rw++CDMmwerrjrckfTtFa8oH7RccslwRzI4VXeWrdLb3w6//vVwR6FFTJ9JZmbu0Ph3rcyc2PPf9oWo2lS1HhOcLiupd+edV7qXDqXD5kEHwZ//DFdcUV1cnaR7s5/FF6/vdiZPhp12GvlbIYz0pj89fepT8Je/wNVXD3ckA5sxo6zPravaVpX3va9U3TtJXesxq7DLLnDxxfDkk8MdiRYhAy68iIiLm7lOHaiq9ZjgdFlJvTvrLNhtt6GNsfTSpYnKgQeWaf6jTR3NfvpyxBHw85/DP0bohKX77itvhDtl6imU1++XvgSf/ezIf/2O9KmyXfbcEy68sLPed4zkJHOllcqHTBddNNyRaBHS35rM8cASwIsjYhlKV1mAZQErmYuCKiuZJpmSenrySbjsMvjRj4Y+1nveAyecAL/8JbzjHUMfr90++9nWm79MmADXXVdtPH1ZeeWSEG27bWtTJhdfvDR6Wm+96mODMlV2s81GfqWtpw98AI47riRGO+443NH0baTukdnTiiuW1+gvf1ka1nSCmTPh/e8f7ij6tvvuZcrsUD8UlBr6WzG9H3AgsAplHWbXX/TZwPdqjkvtUHUl0zWZkrq76CLYdFNYYYWhjzVmDHzzm+VN2s47l/XkneK734Xf/hZmzWrtg72xY9vb4ORjHyuNVebNG/y5Z54J//u/9a3v6qT1mN2NGwdf+xp87nOtb8fz6leX/2vrNGNG6+un2+297y1/EzopyZw0abij6Ntuu5W1w08/Xe+0fI0aff6vlZnHAcdFxCczswN3E9aAXJMpqU5nn13tp+JbbQWveU2pCH7uc9WNW6ff/Q6++lW4/PLO2SsxovUpk+uuW95Id1Ucq3bllaXDbifaZZfywcshhwz+3EcfLc/JGWdUH1d306d3xnRZgB12gA9/uGzt02pX1XaZM6d8rbbacEfSt9VWK/ujXnopTJky3NFoEdDMR6P/iohlMnNORHwe2Bg4MjOvrzk21c01mZLqMm9eafrzta9VO+7RR8OWW5aK5iqrVDt21f7xj1JtOfvszlpDOBRLLlmm237+8/D731c7rXXBApg2rbOa/nQXAf/3f62d+8ADZRrrvHmw2GLVxtXl8cfLXo5rrVXP+FUbP75suXHqqeU1N5LNnFn+Boz0ad5dU2ZNMlWBZnZcPqyRYL4W2Ak4gyany0bE9hFxa0TMbCSofR339ojIiJjcXNiqxJw51U+XHelNDSS1xx//WKpaa6xR7biTJpX1mSP9TeUDD8DUqXD88fC61w13NO31/veX/U0vvbTacW+9tVSDV1qp2nE7waqrlqYxl19e323cckvZHmRMM28NR4iuLrMj/b3HSG76093uu8O557Y2VV7qoZlK5oLGv1OB72bmryNiwLkeETEWOBHYDpgFXB0R52bm9B7HLQMcAFw5qMg1dLNnVzdddrHFyqeKTz45tK0KpGbcfntZh7NgwcDH9rTYYnDkkZ25rquTVD1VtrsvfrE0ltl//zK9a6R56inYddeSbL3rXcMdTfuNGweHH1723Nx22+qSlk7buqRqU6bA+eeX9bJ16JSmP91tvHFZn/3Xv8LrXz/c0fStU5LMiRPL1OM//Qne/ObhjkYdrpkk8/6IOBHYHpjc6DrbzP8YmwEzM/MOgIg4HdgFmN7juK8CRwMHNR21qlFlJROeW5dpkqm6/epX8OIXlwYlg3X77WUvwLPOGtlvSjrZwoXwm9+UamYdVlihNKg46KDSrXMkWbiwVFde9jI49NDhjmb47L47HHVUmXq3xx7VjNmpTX+qMnUqvPvd8I1v1DN+p2xf0l1E+X075ZSR/fd85szOee12TZk1ydQQNZNkvgPYEfh2Zj4aEasDfU597WYN4J5ul2cBz/sNi4iNgLUy87yIMMlst9mzyxv1qnSty1x99erGlHpz4YXwmc/AG984+HPf+EZYc81SZTv99FJpUbWuuqokguuuW99tfOxjcOKJ8Na3ttYJcamlytTADTYoX5MmVdNR8dBDy16Ol1468tdf1WnMmLIed7/9SlW3inWEV15Z1riOVhtvXNZM3n57PWt8p08vjXQ6zf/8D7zqVWWLoyWXHO5oejdzZvmAoBPsvntJ2L/zndLZWmrRgElmZj4REf+iVCZvAZ6mbGkykN7+d3120nxEjAGOA/YecKCIfYB9ACZOdIvOylRdyXQbE7XD7NlwzTVDmzK23XalGrrHHuUT8B12qC4+lSpx3XutjR9fGstc32IPujk9BOpeAAAgAElEQVRzyhq0M84ob67vugte8pLnEs7x4wc/5kMPwcUXwxVXdNYWK3V585tLE5mTTx568vLkk+X52mijSkLrSGPGlD02zz8fDjig+vE7cboslHXfkyeXpmCbbjr481ddtSTwdbrtts6YLgslzhe/GP72N3jDG4Y7GnWwAZPMxvrL1wEvA34KLAH8AhhoXsIsoHuLsjWB+7pdXgZ4JfDHKJ/2rgqcGxE7Z+a07gNl5knASQCTJ08e4au7O0iVazLBDrNqj0svhde+tlSihuJNb4JzzinbCpx0Uqm2aOgyy3rMurdagLJ+qKoPHp95prwRnD69VB3mzx/8GKuvXpLMTtmqpG4RpZr5treVKs5QqkzXXVc+ABjtyfvUqfD971efZD75JNx//8jfCqQvhx5a1tpf2UJ7j7/8pfzOVzmzq7u5c8sWNFU3QavT7ruXD2JNMjUEzUyXfTuwEXAtQGbeGxHNZCZXA5MiYh3gXmAv4NkOCJn5OPBsi7iI+CNwUM8EUzWqa02mVKcLL6yu8rjllmW8HXcsG1DvuWc1445mN99cOhN2WsVp/PjSRGgkNhLqZJttVtaifec7ZYp7q668snPWtNVpu+3KGsQnnoAJE6ob99ZbSwVrXDNvC0eg178eLrigtXP32KP8P7D33pWG9Kzbby/Jeyd17d19d9h+ezjuuM6KWyNKM6+cpzMzaUx1jYimygeZOR/YH7gImAGcmZk3R8RXImLnVgNWhaxkqtNkVptkAmyyCVxyCXzyk2XqrIamq6vsaF6PqOc7/HA45piynrBVo73pT5dllimPQ9Xbw0yf3nlNf6oydWrZ07cundJZtrsNNigfYlx99XBHog7WzEdWZzW6yy4XEe8HPgj8uJnBM/MC4IIe1/Xabi8zt2pmTFXINZnqNP/4R6k4Vd1QZsMN4bLLSpXgW99qLUFaay049tjOnW5WlbPOKo+h1GX99WHnncuauSOPbG2MK6+Eww6rNKyO1bWVSZVT/Duxs2xVdtgBPvGJMmW+lbXYA+nEJDPiuS6zfrijFjXT+OeoiNgBeAZ4NXBEZo6wnvFqyZw5VjLVWbqqmHVUydZfH264oTSAacVll5X/jL/8Zdh339E5xejOO+Hee+F1rxvuSDTSfOlL8JrXwBZbDH5dZdeatjq7FXeSqVPLNiaZ1f0tnD4d9tqrmrE6zSqrlL//f/5zPdt2zJxZf2OhOuy+O7z97WUrImemqAV9JpkRcXFmvgWgkVSaWC5qZs+ufk3mv/5V3XhSTxdeCJ/+dH3jr7hi+WrFJpuU/Tf33rt8+vujH8Haa1cZ3cj3m9+URkq2vVdPa61Vps1+5zutnX/AAaPzg5veTJpU9qO+/vrq1j6P5komlMT9/PPrSTJvuw3e8Y7qx63ba15TPsi44YbyvTRI/VUybY+3KMssjQOqni5rJVN1mT0bpk0b2tYldXvFK+Dyy8u02U03ha9+FT7ykeo+BX7qqTL+xReXr9tvb22cxReHrbYqb6x23LG6ropnnw2fb2YbZY1KH/1o+dLQdU2ZrSLJfOaZMgth0qShj9WppkwpVbtjj62+ateJ02Xh+VNmTTLVgv6SzOUi4m19/TAzz6ohHrXL3LllylKVFQfXZKpOv/996Qa79NLDHUn/xo2Dz362JHBdVc0f/rDswThYmaVb68UXw0UXlX3LNtwQ3vIW+N734JWvbO0N0ezZpdnReefBpz4F661X4p06tbyZaGXMf/8bbrwRtt128OdKGpwpU+CQQ8rXUN12W/n7tPjiQx+rU7361fDf/8I//1n+HlblqafgwQdLJb8T7b576breatfhtdYqe5husEHndi5Wy/pNMoGpQG/vNhIwyexkVa/HBCuZvZk/vyT0rVhqKVhssWrj6WRVd5Wt2wYblKTwmGPKep958wY/Rmb5T/qtby3rPM84A5ZffuixTZhQtkF43/tKFePyy0vCueee5W9DK/s8zplTktTR/EZVapc3vhFuuaUkMEPdl3W0T5WF8sFaV5fZKpPMO+4oyyY6dQnBZpvBQQfBQw8N/tzM0qvgmGPKUqoNNyzLSiZPLv+uv76J5yKuv2f37sz8QNsiUXtVvR4T3CezN3vvXaYQDvYP6cKF8KpXlSRFz21dcuCBwx3J4IwbBwcfXCqbCxe2PkadTRfGj4dttilfxx5bGh+1OiNhNE+3k9pp/Pgya+DCC+G97x3aWNOnlzf8o93UqfDNb1a77n/mzM7+uzhmDHz840MfZ84cuO66suTlkkvga18rSzWOO27oY2vE6u+dr62kFmVWMuu3YEF5A/DPf8Iaawz+3NVXL5+CjvYtMaBMGR03rtpPmNtp7NjO+SR7tDUrkjpV17rMoSaZM2aUsUa7bbaBd72r7OdaxYwRKFORO3E9ZtWWWaZU39/4xueua/WDV3WM/lq1vadtUaj96qhkuibz+a69tjRUGWyCCSUh2Xnn0q1T9W5dIkmdaMcdy3rtVqbid2cls1hqqZIEXXxxdWN2atOfdrBb9CKvz2c4M//RzkDUZlYy63fJJaVBS6t23bVMtVXnrceUpLqtumpJYP7619bHWLCgzLZ5xSuqi6uTTZlS1mVWxSRTo5gfI4xWdVQyl1yyfKL6zDPVjtupLrkEttuu9fO33RZuugn+85/qYupEc+bA1VeXqUySpOd0TZlt1Z13lmR1pHftbpcpU8qHmgsWVDOeSaZGMZPM0aqOSmaE1cwuTzxREqM3van1MZZYolRCzz23urg60e9/D1ts4ZsgSeppqEmmU2Wfb+LE0g/hyiuHPtbTT8MDD7S2fZW0CBgwyYyI10XEJRHxz4i4IyLujIg72hGcalRHJRNcl9nlz38ubbonTBjaOLvu6rpMp8pKUu822QQeeaQ0iWuF25e8UNdWJkN1550laXWbDo1SzVQyfwQcC7we2BSY3PhXnayOSiZYyewy1KmyXaZMKQnrnDlDH6sTdW1dYpIpSS80ZkxpANRqNdNK5gtVlWTaWVajXDMfrzyemRfWHonaa/bs0vm0au6VWVx8MZx88tDHWW452HJL+N3vYI89hj5ep5k+vbyJsimFJPVu6lTYf//WZr1cdx189KPVx9TJNtsM7r8f/vWvUolslesxNco1k2T+ISKOAc4Cnu66MjOvrS0q1c9KZn3uvbesw9h442rG22238uZhNCaZbl0iSf3bbTdYZZWyBnCwxo0rSZWeM3Zs+X/n/POHloDPnNm5eztLFWgmydy88e/kbtclYKvHTuaazPpccknpDDt2bDXj7bwzHHxw6do7fnw1Y3aKCy+ET3xiuKOQpJErAl7/+uGOYtEydSqccsrQk8wpU6qLSeowAyaZmbl1OwJRm1nJrE9V6zG7rL56mS76xz8Obd/NTjNnDlx1lVuXSJLa6y1vgQ99CObObb2z+cyZMGlStXFJHaTPJDMi3p2ZP4uIA3v7eWYeW19Yql1dlczRviZz4UK49FI44ohqx911Vzj77M5MMs88E268cfDn3XMPbL750Dv0SpI0GMsvXzrEX3YZ7LTT4M9/5hmYNcvtSzSq9dddtuujm2X6+FIns5JZjxtvLI/B2mtXO+6uu8I555QktpM88UT5NHjxxcu+n4P5mjQJDj98uO+BJGk0GkqX2bvugjXXHH1LXKRu+qxkZub3G/9+uX3hqG3qXJPZ6n5di4Kqp8p2WW+98snqVVfBFltUP35dLr64VCO/+MXhjkSSpOZNmQLHHlu20hps8zk7y0pN7ZOpRZGVzHpcckl9U1p33bW1FvXD6ZxzYJddhjsKSZIGZ911YbXVSgfewX5NnQqvfvVw3wNpWDXTXVaLmswyjbGOtW6jeU3mU0/B3/8Ov/xlPePvthu85z3w9a/XM37V5s8vLeC/+tXhjkSSpMGJgCuvbH2ZSlUd5qUOZZI5Gs2dC0suWc8fwNFcybz88vLJ5XLL1TP+JpuUDwdmzID116/nNqr017+WjayHspm1JEnDZcyY8iVp0PrrLttrV9kudpftYHWtx4TRvU/mxRfXsx6zy5gxz02Z7YQk06mykiRJo1J/H890dZGdDHwUWKPxtS+wQf2hqTZz5tSbZI7WSmZdTX+669rKZKTLNMmUJEkapfrrLvtlgIi4GNg4M+c0Lh8G1LToTG0xe3Y9TX9g9K7J/Pe/4e67YbPN6r2dN72pdK2bNau0Rx+pbr4ZFiyw8YEkSdIo1MxE84nAM90uPwOsXUs0ao86K5nLLFPWfC5YUM/4I9Wll8JWW5WucnVabLHSVv2cc+q9naE691zYeefBt32XJElSx2vmHfGpwFURcTaQwG7AT2uNSvWqs5I5diwsvXRpUFNXA5yRqM6tS3radVc44YTWbi8CXvrS+hsZnHMOHHFEvbchSZKkEWnAJDMzj4iIC4E3NK56f2ZeV29YqlWdlUx4bl3maEkyM0uSecgh7bm97beHb34Tdtxx8Oc+/jh8+MP1JoD33Qe33Vam9kqSJGnUaXZu31LA7Mz8SUSsHBHrZOaddQamGtVZyYTRty5z+nQYPx5e9rL23N7SS8Pf/tbauffeCxtuCB/5SH1bi/z2tyURXmyxesaXJEnSiDbgnLmI+BLwOeDgxlWLAT+rMyjVrF2VzNGia6psJ6w/XGMN2G8/+MIX6rsNu8pKkiSNas1UMncDNgKuBcjM+yKixgxFtZszp95KZifulfnYY/Cd77TWsOjXv4ZDD60+prp85jOw7rpwzTWwySbVjj1nDlx+OZx+erXjSpIkqWM00/3jmcxMStMfImLpekNS7WbPtpLZ08UXw5lnwsKFg//aYw/YYYfhvgfNW2YZ+PKX4aCDynrSKl10EWy5Zb0fYkiSJGlEa6aSeWZEfB9YPiI+DHwA+EG9YalWdVcyO3FN5rRpsOee9U4jHUk+8AH41rfgvPNgp52qG9epspIkSaPegJXMzPwG8Cvg18B6wKGZ+e26A1ONrGS+0LRp1U8dHcnGjYNjjilTZ+fNq2bMefPgggvK/piSJEkatZraLC8zL8nMz2TmQZl5Sd1BqWauyXy+hQvh2mtHV5IJZYrvmmvCD39YzXiXXw7rrFPGlCRJ0qjVTHfZt0XEbRHxeETMjog5EdFBGYRewErm891+e4l55ZWHO5L2ioBvfKOsz6ziQwGnykqSJInmKplHAztn5nKZuWxmLpOZdvXoZK7JfL5rroHJk4c7iuHxmteUPS2POmpo42SaZEqSJAloLsn8d2bOqD0StY+VzOebNm30JpkAhx8O3/se3HNP62PcdFP591WvqiYmSZIkdaxmksxpEXFGRLyzMXX2bRHxtmYGj4jtI+LWiJgZEZ/v5ef7RsRNEXF9RFweERsM+h5o8FyT+XyjrelPT2uuCfvuC4cc0voY55xTGv5EVBeXJEmSOlIzW5gsCzwJvKXbdQmc1d9JETEWOBHYDpgFXB0R52bm9G6H/SIzv9c4fmfgWGD75sPXoGXCE0/AhAn13UYnVTIXLoTrrhvdSSbA5z4H665busOuvfbgzz/rLPjmNysPS5IkSZ1nwCQzM9/f4tibATMz8w6AiDgd2AV4NsnMzO7lrqUpyavqNHcuLLkkjB1b32100prM226DFVaAFVcc7kiG17LLwvHHw0EHtXb+6qvDG95QbUySJEnqSH0mmRHx2cw8OiK+TS/JX2YeMMDYawDdF3nNAjbv5Xb2Aw4ExgPbNBO0hqDu9ZjQWZXM0dz0p6e99ipfkiRJ0hD0V8nsavYzrcWxe1uc1VuyeiJwYkS8CzgEeN8LBorYB9gHYOLEiS2GI6D+9Zjw3JrMzJG/Rm+0r8eUJEmSKtZnkpmZv238e0qLY88C1up2eU3gvn6OPx34vz5iOQk4CWDy5MlOqR2KdlQyx4+HcePgqadgqaXqva2hmjYNDj10uKOQJEmSFhkDrsmMiJWBzwEbAEt0XZ+ZA01tvRqYFBHrAPcCewHv6jH2pMy8rXFxCnAbqlc7Kpnw3LrMkZxkLlgA119vJVOSJEmqUDNbmPycMnV2HeDLwF2UBLJfmTkf2B+4qHH+mZl5c0R8pdFJFmD/iLg5Iq6nrMt8wVRZVawdlUzojHWZ//wnrLwyvOhFwx2JJEmStMhoZguTFTPzRxHxicz8E/CniPhTM4Nn5gXABT2uO7Tb958YVLQaunZVMjthr0yb/kiSJEmVaybJnNf49/6ImEJZV7lmfSGpVlYyn2PTH0mSJKlyzUyXPTwilgM+DRwE/BD4VK1RqT7tXpM5kk2bZiVTkiRJqtiAlczMPK/x7ePA1vWGo9pZySwWLIAbboCNNx7uSCRJkqRFSp9JZkR8m172teySmQfUEpHqNWcOrLZa/bcz0tdk3nILrLoqLL/8cEciSZIkLVL6q2ROa1sUah8rmYVNfyRJkqRa9JlkZuYp3S9HxLLl6pxTe1SqTzvXZM6aVf/ttMqmP5IkSVItBmz8ExGTI+Im4EbgHxFxQ0T47rxTWcksbPojSZIk1aKZLUx+DHwsM/8CEBGvB34CbFhnYKrJnDntSzJH6prM+fPhxhtho42GOxJJkiRpkdPMFiZzuhJMgMy8HHDKbKeaPbs902VHciVzxgxYY40SoyRJkqRKNVPJvCoivg+cRuk2uyfwx4jYGCAzr60xPlWtXZXMkbxPplNlJUmSpNo0k2S+pvHvl3pc/1pK0rlNpRGpXlYyS2dZm/5IkiRJtRgwyczMrdsRiNpg4UKYOxcmTKj/tkbymsxp0+Ad7xjuKCRJkqRFUjPdZU+NiOW6XX5JRPy+3rBUi7lzYcklYezY+m9rpFYy582Dm26y6Y8kSZJUk2Ya/1wOXBkRO0bEh4FLgOPrDUu1aNd6TIClloJnnilJ3UgyfTpMnNi+x0GSJEkaZZqZLvv9iLgZ+APwELBRZj5Qe2Sq3pw57VmPCRDxXPOflVZqz202Y9o012NKkiRJNWpmuux7KHtlvhc4GbggIl5dc1yqw+zZ7a3gjcR1mddcY2dZSZIkqUbNTJfdHXh9Zp6WmQcD+wKn1BuWatHOSiaMzHWZbl8iSZIk1aqZ6bK79rh8VURsVl9Iqk27K5kjba/MZ56Bf/wDXvOagY+VJEmS1JI+K5kRcWa374/q8ePzaotI9Rntlcybb4Z11mnPFi6SJEnSKNVfJXNSt++3Az7X7fLK9YSjWnX6msxMuPRS+Pa34eGHB3/+ww/D5ptXF48kSZKkF+gvycwWf6aRqt2VzKqmyy5cCOecA0ceCU88AZ/9LKy7bmtjrbfe0OORJEmS1Kf+ksylImIjypTaJRvfR+NryXYEp4oNRyVzKEnm/Plw2mnw9a/DkkvCF74Au+wCY5rpVyVJkiRpOPSXZN4PHNv4/oFu33ddVqeZMwdWW619t7fccvD3v8MZZwz+3PvvhxNOgJe8BI4/Ht785rL3piRJkqQRrc8kMzO3bmcgaoN2VzK33hquuw7OOmvw5y69NPzsZ/Da11YflyRJkqTaDLiFiRYh7V6TufnmrVUxJUmSJHUsF7eNJu2uZEqSJEkadUwyR5N2VzIlSZIkjToDJplRvDsiDm1cnhgRm9UfmipnJVOSJElSzZqpZH4X2BJ4Z+PyHODE2iJSfaxkSpIkSapZM41/Ns/MjSPiOoDMfDQixtccl+pgJVOSJElSzZqpZM6LiLFAAkTEysDCWqNS9RYuhLlzYcKE4Y5EkiRJ0iKsmSTzBOBsYJWIOAK4HDiy1qhUvblzYcklYezY4Y5EkiRJ0iJswOmymfnziLgG2BYIYNfMnFF7ZKqW6zElSZIktcGASWZEbAHcnJknNi4vExGbZ+aVtUen6rgeU5IkSVIbNNP45/+AjbtdntvLdWqXs8+GCy4Y/HkPPWSSKUmSJKl2zSSZkZnZdSEzF0ZEM+epDiecAJtuCpMmDf7cV7yi+ngkSZIkqZtmksU7IuIASvUS4GPAHfWFpD5lwg03wOmnw4tfPNzRSJIkSdILNNNddl/gtcC9wCxgc2CfOoNSH+69FxZbzARTkiRJ0ojVTHfZ/wB7tSEWDeSGG+DVrx7uKCRJkiSpT810l10Z+DCwdvfjM/MDTZy7PfAtYCzww8z8eo+fHwh8CJgPPAh8IDPvHkT8o8uNN8KGGw53FJIkSZLUp2bWZJ4D/AW4FFjQ7MARMRY4EdiOMs326og4NzOndzvsOmByZj4ZER8Fjgb2bPY2Rp0bboApU4Y7CkmSJEnqUzNJ5lKZ+bkWxt4MmJmZdwBExOnALsCzSWZm/qHb8VcA727hdkaPG2+Egw8e7igkSZIkqU/NNP45LyJ2bGHsNYB7ul2e1biuLx8ELmzhdkaHp56CO++E9dcf7kgkSZIkqU/NVDI/AfxvRDwNzAMCyMxcdoDzopfrspfriIh3A5OBN/Xx831odLSdOHFiEyEvgqZPL3tjjh8/3JFIkiRJUp8GrGRm5jKZOSYzl8zMZRuXB0owoVQu1+p2eU3gvp4HRcSbgS8AO2fm033EcFJmTs7MySuvvHITN70IsrOsJEmSpA7QTCWTiHgRMAlYouu6zPzzAKddDUyKiHUoe2zuBbyrx7gbAd8Htm9slaK+2FlWkiRJUgdoZguTD1GmzK4JXA9sAfwd2Ka/8zJzfkTsD1xE2cLkx5l5c0R8BZiWmecCxwATgF9GBMC/MnPnIdyfRdcNN8COrSyNlSRJkqT2aXZN5qbAFZm5dUS8AvhyM4Nn5gXABT2uO7Tb928eRKyjV2apZDpdVpIkSdII10x32f9m5n8BImLxzLwFWK/esPQ8994L48bBi1883JFIkiRJUr+aqWTOiojlgd8Al0TEo/TSwEc1sumPJEmSpA4xYJKZmbs1vj0sIv4ALAf8rtao9Hw2/ZEkSZLUIfpMMiNi2cycHRErdLv6psa/E4BHao1Mz7nhBpgyZbijkCRJkqQB9bcm8xeNf68BpvXyr9rFSqYkSZKkDtFnJTMzp0bZV+RNmfmvNsak7p56Cu68E9Zff7gjkSRJkqQB9dtdNjMTOLtNsag306fDpEkwfvxwRyJJkiRJA2pmC5MrImLT2iNR7+wsK0mSJKmDNLOFydbARyLibmAuEJQip4sE28H1mJIkSZI6SDNJ5g61R6G+3XAD7LjjcEchSZIkSU1pZp/MuwEiYhVgidoj0nMyrWRKkiRJ6igDrsmMiJ0j4jbgTuBPwF3AhTXHJYB774Vx42DVVYc7EkmSJElqSjONf74KbAH8MzPXAbYF/lprVCqsYkqSJEnqMM0kmfMy82FgTESMycw/AK+pOS6BnWUlSZIkdZxmGv88FhETgD8DP4+I/wDz6w1LQKlk7mDfJUmSJEmdo5lK5i7AU8CngN8BtwM71RmUGqxkSpIkSeowfVYyI+I7wC8y82/drj6l/pAEwFNPwZ13wvrrD3ckkiRJktS0/iqZtwHfjIi7IuKoiHAdZjtNnw6TJsH48cMdiSRJkiQ1rc8kMzO/lZlbAm8CHgF+EhEzIuLQiFi3bRGOVk6VlSRJktSBBlyTmZl3Z+ZRmbkR8C5gN2BG7ZGNdm5fIkmSJKkDDZhkRsRiEbFTRPwcuBD4J7B77ZGNdlYyJUmSJHWg/hr/bAe8E5gCXAWcDuyTmXPbFNvolWklU5IkSVJH6m+fzP8FfgEclJmPtCkeAdx7L4wbB6uuOtyRSJIkSdKg9JlkZubW7QxE3VjFlCRJktShBlyTqWHgekxJkiRJHcokcySykilJkiSpQ5lk1uVvf4OI1r5++UvYbLPhvgeSJEmSNGj9Nf7RUGy5JSxc2Pr5EdXFIkmSJEltYpJZF5NESZIkSaOQ02UlSZIkSZUxyZQkSZIkVcYkU5IkSZJUGZNMSZIkSVJlTDIlSZIkSZUxyZQkSZIkVcYkU5IkSZJUGZNMSZIkSVJlTDIlSZIkSZUxyZQkSZIkVabWJDMito+IWyNiZkR8vpefvzEiro2I+RHx9jpjkSRJkiTVr7YkMyLGAicCOwAbAO+MiA16HPYvYG/gF3XFIUmSJElqn3E1jr0ZMDMz7wCIiNOBXYDpXQdk5l2Nny2sMQ5JkiRJUpvUOV12DeCebpdnNa6TJEmSJC2i6kwyo5frsqWBIvaJiGkRMe3BBx8cYliSJEmSpLrUmWTOAtbqdnlN4L5WBsrMkzJzcmZOXnnllSsJTpIkSZJUvTqTzKuBSRGxTkSMB/YCzq3x9iRJkiRJw6y2JDMz5wP7AxcBM4AzM/PmiPhKROwMEBGbRsQsYA/g+xFxc13xSJIkSZLqV2d3WTLzAuCCHtcd2u37qynTaCVJkiRJi4A6p8tKkiRJkkYZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlTHJlCRJkiRVxiRTkiRJklQZk0xJkiRJUmVMMiVJkiRJlak1yYyI7SPi1oiYGRGf7+Xni0fEGY2fXxkRa9cZjyRJkiSpXrUlmRExFjgR2AHYAHhnRGzQ47APAo9m5suB44Cj6opHkiRJklS/OiuZmwEzM/OOzHwGOB3YpccxuwCnNL7/FbBtRESNMUmSJEmSalRnkrkGcE+3y7Ma1/V6TGbOBx4HVqwxJkmSJElSjcbVOHZvFcls4RgiYh9gn8bFpyPiH0OMTe2zEvDQcAehpvl8dRafr87i8yKFNu8AAAujSURBVNVZfL46i89XZ/H56izrDfaEOpPMWcBa3S6vCdzXxzGzImIcsBzwSM+BMvMk4CSAiJiWmZNriViV8/nqLD5fncXnq7P4fHUWn6/O4vPVWXy+OktETBvsOXVOl70amBQR60TEeGAv4Nwex5wLvK/x/duByzLzBZVMSZIkSVJnqK2SmZnzI2J/4CJgLPDjzLw5Ir4CTMvMc4EfAadGxExKBXOvuuKRJEmSJNWvzumyZOYFwAU9rju02/f/BfYY5LAnVRCa2sfnq7P4fHUWn6/O4vPVWXy+OovPV2fx+eosg36+wtmpkiRJkqSq1LkmU5IkSZI0ynRUkhkR20fErRExMyI+P9zxqH8RcVdE3BQR/7+9O4+Vs6rDOP59qCxaiJVVWbRQq2XTCrLJ1jaIVQkUhSCBQIxbBZFFBCEGoQkRLCgat0DFooJY2d1RKBQJthW40AoiAo0ipYWwWZZK28c/3jN2mM7crVfmveT5JDcz7zvnPef3zrknc3/3nPednsHclSr+vyRdKmlp81cCSdpY0u8lPVge39TNGGO1Dv11tqR/lTHWI+lD3YwxVpO0jaTZku6X9BdJJ5b9GWM100tfZXzVlKQNJM2TdE/ps3PK/m0lzS3j62flxpPRRb301UxJjzSNr/HdjjVWkzRC0t2Sflm2Bzy2hk2SKWkE8B3gg8AOwJGSduhuVNEPE22Pz22qa2kmMLll35eAm2yPBW4q21EPM1mzvwC+UcbY+HIdfNTDCuALtrcH9gSOL59ZGWP106mvIOOrrpYDk2y/GxgPTJa0J3A+VZ+NBZ4GPtHFGKPSqa8Avtg0vnq6F2K0cSJwf9P2gMfWsEkygd2Bv9t+2PZ/gCuBQ7ocU8SwZXsOa34v7SHAZeX5ZcCUVzWo6KhDf0VN2V5s+67y/N9UH9ZbkTFWO730VdSUK8vK5rrlx8Ak4KqyP+OrBnrpq6gpSVsDHwZmlG0xiLE1nJLMrYB/Nm0/Sj4E6s7AjZLulPTpbgcT/bKF7cVQ/eEFbN7leKJvn5N0b1lOm6WXNSRpNPAeYC4ZY7XW0leQ8VVbZTlfD7AU+D3wEPCM7RWlSP5OrInWvrLdGF/nlvH1DUnrdzHEeKWLgNOAVWV7EwYxtoZTkqk2+/KfkHrb2/YuVEucj5e0X7cDiniN+R4whmoJ0mLgwu6GE60kbQhcDZxk+7luxxOdtemrjK8as73S9nhga6rVbtu3K/bqRhXttPaVpJ2AM4BxwG7AxsDpXQwxCkkHAUtt39m8u03RPsfWcEoyHwW2adreGnisS7FEP9h+rDwuBa6l+hCIelsi6S0A5XFpl+OJXtheUj68VwGXkDFWK5LWpUpaLrd9TdmdMVZD7foq42t4sP0McAvV9bSjJDW+Az5/J9ZMU19NLsvUbXs58EMyvupib+BgSYuoLk2cRDWzOeCxNZySzPnA2HJ3o/WAjwE3dDmm6EDSSEkbNZ4DBwILez8qauAG4Njy/Fjg+i7GEn1oJCvFoWSM1Ua5huUHwP22v970UsZYzXTqq4yv+pK0maRR5fnrgQOorqWdDRxWimV81UCHvvpr0z/bRHV9X8ZXDdg+w/bWtkdT5Vo32z6KQYwt2cNnJUG5ffhFwAjgUtvndjmk6EDSdlSzlwCvA65If9WLpJ8CE4BNgSXAV4DrgFnAW4F/AIfbzs1maqBDf02gWspnYBHwmcb1ftFdkvYBbgMWsPq6ljOprvXLGKuRXvrqSDK+aknSu6huPjKCasJklu1p5W+PK6mWX94NHF1myqJLeumrm4HNqJZi9gBTm24QFDUgaQJwqu2DBjO2hlWSGREREREREfU2nJbLRkRERERERM0lyYyIiIiIiIghkyQzIiIiIiIihkySzIiIiIiIiBgySTIjIiIiIiJiyCTJjIiIQZFkSRc2bZ8q6ewhqnumpMP6LrnW7Rwu6X5Js1v2j5Y04O9tkzRK0nFrGdMMSTsMoPzukuZIekDSX8vxb1ibGFrqP2kw9UmaJumAPspMkPS+wUcXERF1lCQzIiIGaznwEUmbdjuQZpJGDKD4J4DjbE8couZHAWuVZNr+pO37+lNW0hbAz4HTbb8T2B74LbDR2sTQ4iSgbZLZ23tt+yzbf+ij7glAksyIiNeYJJkRETFYK4CLgZNbX2idiZS0rDxOkHSrpFmS/ibpPElHSZonaYGkMU3VHCDptlLuoHL8CEnTJc2XdK+kzzTVO1vSFcCCNvEcWepfKOn8su8sYB/g+5KmdzpJSTuW+HpKm2PL/lNKfQslnVSKnweMKWWnqzK9lFkg6YimeG+RdFWZfbxcksprt0h6b3k+WdJdku6RdFOb8I4HLrN9B4ArV9leImljSdeVmP9UvhQdSWdLurS087Ckz5f9IyX9qrS1UNIR5bUtgdmN2V5Jy8os5VxgL0lnlf5YKOnipvP43++ApEWSzinnskDSOEmjganAyeX92rfMLC8sMczp1CcREVFvr+t2ABERMax9B7hX0tcGcMy7qWbcngIeBmbY3l3SicAJVDNnAKOB/YExVEnO24FjgGdt7yZpfeB2STeW8rsDO9l+pLkxSVsC5wO7Ak8DN0qaYnuapEnAqbb/3Eu8U4Fv2r5c0nrACEm7Ah8H9gAEzJV0K/ClEsP40vZHgfHlnDcF5jclT+8BdgQeA24H9gb+2BT3ZsAlwH62H5G0cZvYdgIu6xD3OcDdtqeU8/xRiQVgHDCRasbzAUnfAyYDj9n+cGn/jbaflXQKMNH2k+XYkcBC22eVcvfZnlae/xg4CPhFm3ietL2LquXEp9r+pKTvA8tsX1COXwB8wPa/JI3qcF4REVFzmcmMiIhBs/0cVfLy+QEcNt/2YtvLgYeARpK4gCqxbJhle5XtB6mS0XHAgcAxknqAucAmwNhSfl5rglnsBtxi+wnbK4DLgf0GEO8dwJmSTgfeZvtFqhnQa20/b3sZcA2wb5tj9wF+anul7SXArSWeRryP2l4F9LScO8CewJzGOdl+agAxN9r+cTn2ZmATSW8sr/3K9vKSOC4FtqB6/w+QdL6kfW0/26HelcDVTdsTJc0tCeIkqsS5nWvK452sea4NtwMzJX0KGMiy54iIqJEkmRERsbYuorq2cWTTvhWUz5iyfHK9pteWNz1f1bS9ileusHFLO6aaNTzB9vjys63tRpL6fIf41N8Tacf2FcDBwIvA78qsYH/r7K1c8/uwkjVXF4k134NWf6Gaoe1v24361mjb9t9KXQuAr5blxO28ZHslgKQNgO8Ch9nemWrmdYMOxzXabHeuVXD2VODLwDZAj6RNOtQVERE1liQzIiLWSplhm0WVaDYsYnXycwiw7iCqPlzSOqqu09wOeAD4HfBZSesCSHqHpJG9VUI147m/pE1V3ajmSKoZxX6RtB3wsO1vATcA7wLmAFMkvaG0fyhwG/BvXnnTnTnAEaquJd2MagZ1Xj+bvqPEvW2Jo91y2W8Dx0raoyneoyW9ubR9VNk3gWq56nO9nOeWwAu2fwJcAOxSXmo9p2aNhPJJSRsCA70j8CvqljTG9tyyFPdJqmQzIiKGmVyTGRERQ+FC4HNN25cA10uaB9xE51nG3jxAlQxuAUy1/ZKkGVRLLe8qM6RPAFN6q8T2YklnALOpZvd+bfv6AcRxBHC0pJeBx4Fptp+SNJPVCeMM23cDSLpd1def/AY4DdgLuIdqFvE0249LGtdXo7afkPRp4BpJ61Ata31/S5klkj4GXCBpc6rZ4DlUS1PPBn4o6V7gBeDYPprcGZguaRXwMvDZsv9i4DeSFrfehdf2M5IuoZr9XATM7+u8WvwCuErSIVTX456s6sZKovq9uWeA9UVERA3I7mslTkRERERERET/ZLlsREREREREDJkkmRERERERETFkkmRGRERERETEkEmSGREREREREUMmSWZEREREREQMmSSZERERERERMWSSZEZERERERMSQSZIZERERERERQ+a/J4b71B9TorcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "isotonic_constraint_list = np.linspace(2,35,100)\n",
    "r2 = []\n",
    "\n",
    "for k in isotonic_constraint_list:\n",
    "    X_predict = np.linspace(3,97,k)\n",
    "    iso_reg = IsotonicRegression().fit(X_train, y_train)\n",
    "    y_predict = iso_reg.predict(X_predict)\n",
    "    y_predict_test = np.interp(X_test, X_predict, y_predict, left=None, right=None, period=None)\n",
    "    r2.append(explained_variance_score(y_test,y_predict_test))\n",
    "\n",
    "plt.subplot(111)\n",
    "plt.plot(isotonic_constraint_list, r2, color='red', linewidth=1, label='model')\n",
    "plt.title('Isotonic Regression Tuning Number of Isotonic Constraints'); plt.xlabel('Number of Isotonic Constraints'); plt.ylabel('Variance Explained in Testing')\n",
    "plt.xlim(0,40); plt.ylim(0,0.6)\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.0, wspace=0.2, hspace=0.2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Comments\n",
    "\n",
    "Isotonic regression provides a simple, piece-wise linear model with specified isotonic and monotonic constraint. The hyperparameter is the number of isotonic constraints. I hope this was helpful,\n",
    "\n",
    "*Michael*\n",
    "\n",
    "Michael Pyrcz, Ph.D., P.Eng. Associate Professor The Hildebrand Department of Petroleum and Geosystems Engineering, Bureau of Economic Geology, The Jackson School of Geosciences, The University of Texas at Austin\n",
    "On twitter I'm the @GeostatsGuy.\n",
    "\n",
    "\n",
    "***\n",
    "\n",
    "#### More on Michael Pyrcz and the Texas Center for Geostatistics:\n",
    "\n",
    "### Michael Pyrcz, Associate Professor, University of Texas at Austin \n",
    "*Novel Data Analytics, Geostatistics and Machine Learning Subsurface Solutions*\n",
    "\n",
    "With over 17 years of experience in subsurface consulting, research and development, Michael has returned to academia driven by his passion for teaching and enthusiasm for enhancing engineers' and geoscientists' impact in subsurface resource development. \n",
    "\n",
    "For more about Michael check out these links:\n",
    "\n",
    "#### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n",
    "\n",
    "#### Want to Work Together?\n",
    "\n",
    "I hope this content is helpful to those that want to learn more about subsurface modeling, data analytics and machine learning. Students and working professionals are welcome to participate.\n",
    "\n",
    "* Want to invite me to visit your company for training, mentoring, project review, workflow design and / or consulting? I'd be happy to drop by and work with you! \n",
    "\n",
    "* Interested in partnering, supporting my graduate student research or my Subsurface Data Analytics and Machine Learning consortium (co-PIs including Profs. Foster, Torres-Verdin and van Oort)? My research combines data analytics, stochastic modeling and machine learning theory with practice to develop novel methods and workflows to add value. We are solving challenging subsurface problems!\n",
    "\n",
    "* I can be reached at mpyrcz@austin.utexas.edu.\n",
    "\n",
    "I'm always happy to discuss,\n",
    "\n",
    "*Michael*\n",
    "\n",
    "Michael Pyrcz, Ph.D., P.Eng. Associate Professor The Hildebrand Department of Petroleum and Geosystems Engineering, Bureau of Economic Geology, The Jackson School of Geosciences, The University of Texas at Austin\n",
    "\n",
    "#### More Resources Available at: [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
